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; }
+ }
+ }
+}