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(x.HeaderPresenter.Child)); + } + [Fact] public void Root_ItemContainerGenerator_Containers_Should_Be_Root_Containers() { @@ -302,6 +329,7 @@ namespace Avalonia.Controls.UnitTests control.Template = CreateTreeViewItemTemplate(); control.ApplyTemplate(); control.Presenter.ApplyTemplate(); + control.HeaderPresenter.ApplyTemplate(); ApplyTemplates(control.Presenter.Panel.Children); } } @@ -354,10 +382,21 @@ namespace Avalonia.Controls.UnitTests private IControlTemplate CreateTreeViewItemTemplate() { - return new FuncControlTemplate(parent => new ItemsPresenter + return new FuncControlTemplate(parent => new Panel { - Name = "PART_ItemsPresenter", - [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty], + Children = new Controls + { + new ContentPresenter + { + Name = "PART_HeaderPresenter", + [~ContentPresenter.ContentProperty] = parent[~TreeViewItem.HeaderProperty], + }, + new ItemsPresenter + { + Name = "PART_ItemsPresenter", + [~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty], + } + } }); }