diff --git a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs index d4aad6236e..66a2db8a4f 100644 --- a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs +++ b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs @@ -165,22 +165,33 @@ namespace Perspex.Controls.Generators /// The created container control. protected virtual T CreateContainer(object item) { - T result = item as T; + var container = item as T; - if (result == null) + if (item == null) + { + return null; + } + else if (container != null) + { + return container; + } + else { var template = GetTreeDataTemplate(item); - - result = new T + var result = new T { Header = template.Build(item), Items = template.ItemsSelector(item), IsExpanded = template.IsExpanded(item), - DataContext = item, }; - } - return result; + if (!(item is IControl)) + { + result.DataContext = item; + } + + return result; + } } /// diff --git a/tests/Perspex.Controls.UnitTests/TreeViewTests.cs b/tests/Perspex.Controls.UnitTests/TreeViewTests.cs new file mode 100644 index 0000000000..b3cb7dbbe3 --- /dev/null +++ b/tests/Perspex.Controls.UnitTests/TreeViewTests.cs @@ -0,0 +1,101 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Linq; +using Perspex.Controls; +using Perspex.Controls.Presenters; +using Perspex.Controls.Templates; +using Perspex.LogicalTree; +using Perspex.Styling; +using Xunit; + +namespace Perspex.Controls.UnitTests +{ + public class TreeViewTests + { + [Fact] + public void LogicalChildren_Should_Be_Set() + { + var target = new TreeView + { + Template = new ControlTemplate(CreateTreeViewTemplate), + Items = new[] { "Foo", "Bar", "Baz " }, + }; + + target.ApplyTemplate(); + + Assert.Equal(3, target.GetLogicalChildren().Count()); + + foreach (var child in target.GetLogicalChildren()) + { + Assert.IsType(child); + } + } + + [Fact] + public void DataContexts_Should_Be_Correctly_Set() + { + var items = new object[] + { + "Foo", + new Item("Bar"), + new TextBlock { Text = "Baz" }, + new TreeViewItem { Header = "Qux" }, + }; + + var target = new TreeView + { + Template = new ControlTemplate(CreateTreeViewTemplate), + DataContext = "Base", + DataTemplates = new DataTemplates + { + new FuncDataTemplate(x => new Button { Content = x }) + }, + Items = items, + }; + + target.ApplyTemplate(); + + var dataContexts = target.Presenter.Panel.Children + .Cast() + .Select(x => x.DataContext) + .ToList(); + + Assert.Equal( + new object[] { items[0], items[1], "Base", "Base" }, + dataContexts); + } + + private Control CreateTreeViewTemplate(ITemplatedControl parent) + { + return new ScrollViewer + { + Template = new ControlTemplate(CreateScrollViewerTemplate), + Content = new ItemsPresenter + { + Name = "itemsPresenter", + [~ItemsPresenter.ItemsProperty] = parent.GetObservable(ItemsControl.ItemsProperty), + } + }; + } + + private Control CreateScrollViewerTemplate(ITemplatedControl parent) + { + return new ScrollContentPresenter + { + [~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty), + }; + } + + private class Item + { + public Item(string value) + { + Value = value; + } + + public string Value { get; } + } + } +}