diff --git a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs
index 83b574b5c8..681bea865a 100644
--- a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs
+++ b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs
@@ -75,7 +75,7 @@ namespace Avalonia.Controls.Generators
}
else
{
- var template = GetTreeDataTemplate(item);
+ var template = GetTreeDataTemplate(item, ItemTemplate);
var result = new T();
result.SetValue(ContentProperty, template.Build(item));
@@ -123,9 +123,9 @@ namespace Avalonia.Controls.Generators
///
/// The item.
/// The template.
- private ITreeDataTemplate GetTreeDataTemplate(object item)
+ private ITreeDataTemplate GetTreeDataTemplate(object item, IDataTemplate primary)
{
- var template = Owner.FindDataTemplate(item) ?? FuncDataTemplate.Default;
+ var template = Owner.FindDataTemplate(item, primary) ?? FuncDataTemplate.Default;
var treeTemplate = template as ITreeDataTemplate ??
new FuncTreeDataTemplate(typeof(object), template.Build, x => null);
return treeTemplate;
diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs
index 462e844bb6..b966d09b1f 100644
--- a/src/Avalonia.Controls/TreeView.cs
+++ b/src/Avalonia.Controls/TreeView.cs
@@ -96,7 +96,7 @@ namespace Avalonia.Controls
var result = new TreeItemContainerGenerator(
this,
TreeViewItem.HeaderProperty,
- null,
+ TreeViewItem.ItemTemplateProperty,
TreeViewItem.ItemsProperty,
TreeViewItem.IsExpandedProperty,
new TreeContainerIndex());
diff --git a/src/Avalonia.Controls/TreeViewItem.cs b/src/Avalonia.Controls/TreeViewItem.cs
index a9be3f4796..bed27ef033 100644
--- a/src/Avalonia.Controls/TreeViewItem.cs
+++ b/src/Avalonia.Controls/TreeViewItem.cs
@@ -80,7 +80,7 @@ namespace Avalonia.Controls
return new TreeItemContainerGenerator(
this,
TreeViewItem.HeaderProperty,
- null,
+ TreeViewItem.ItemTemplateProperty,
TreeViewItem.ItemsProperty,
TreeViewItem.IsExpandedProperty,
_treeView?.ItemContainerGenerator.Index ?? new TreeContainerIndex());
@@ -91,6 +91,11 @@ namespace Avalonia.Controls
{
base.OnAttachedToLogicalTree(e);
_treeView = this.GetLogicalAncestors().OfType().FirstOrDefault();
+
+ if (ItemTemplate == null && _treeView?.ItemTemplate != null)
+ {
+ ItemTemplate = _treeView.ItemTemplate;
+ }
}
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
diff --git a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
index 5404218a4b..7b19a6a4e2 100644
--- a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs
@@ -35,6 +35,33 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2));
}
+ [Fact]
+ public void Items_Should_Be_Created_Using_ItemTemplate_If_Present()
+ {
+ TreeView target;
+
+ var root = new TestRoot
+ {
+ Child = target = new TreeView
+ {
+ Template = CreateTreeViewTemplate(),
+ Items = CreateTestTreeData(),
+ ItemTemplate = new FuncTreeDataTemplate(
+ _ => new Canvas(),
+ x => x.Children),
+ }
+ };
+
+ ApplyTemplates(target);
+
+ var items = target.ItemContainerGenerator.Index.Items
+ .OfType()
+ .ToList();
+
+ Assert.Equal(4, items.Count);
+ Assert.All(items, x => Assert.IsType