Browse Source

Correctly set TreeView item DataContexts.

Also added a few tests for TreeView.
pull/261/head
Steven Kirk 11 years ago
parent
commit
19498ab03d
  1. 25
      src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
  2. 101
      tests/Perspex.Controls.UnitTests/TreeViewTests.cs

25
src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs

@ -165,22 +165,33 @@ namespace Perspex.Controls.Generators
/// <returns>The created container control.</returns> /// <returns>The created container control.</returns>
protected virtual T CreateContainer(object item) 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); var template = GetTreeDataTemplate(item);
var result = new T
result = new T
{ {
Header = template.Build(item), Header = template.Build(item),
Items = template.ItemsSelector(item), Items = template.ItemsSelector(item),
IsExpanded = template.IsExpanded(item), IsExpanded = template.IsExpanded(item),
DataContext = item,
}; };
}
return result; if (!(item is IControl))
{
result.DataContext = item;
}
return result;
}
} }
/// <summary> /// <summary>

101
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<TreeViewItem>(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<Item>(x => new Button { Content = x })
},
Items = items,
};
target.ApplyTemplate();
var dataContexts = target.Presenter.Panel.Children
.Cast<Control>()
.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; }
}
}
}
Loading…
Cancel
Save