Browse Source

Ensure TreeViewItems are removed from index.

When TreeViewItem is removed from TreeView.
pull/386/head
Steven Kirk 10 years ago
parent
commit
3bfba9c8ce
  1. 6
      src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
  2. 6
      src/Perspex.Controls/TreeViewItem.cs
  3. 30
      tests/Perspex.Controls.UnitTests/TreeViewTests.cs

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

@ -103,6 +103,12 @@ namespace Perspex.Controls.Generators
return base.Dematerialize(startingIndex, count);
}
public override IEnumerable<ItemContainer> RemoveRange(int startingIndex, int count)
{
Index.Remove(GetContainerRange(startingIndex, count));
return base.RemoveRange(startingIndex, count);
}
/// <summary>
/// Gets the data template for the specified item.
/// </summary>

6
src/Perspex.Controls/TreeViewItem.cs

@ -88,6 +88,12 @@ namespace Perspex.Controls
_treeView = this.GetLogicalAncestors().OfType<TreeView>().FirstOrDefault();
}
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
{
base.OnDetachedFromLogicalTree(e);
ItemContainerGenerator.Clear();
}
/// <inheritdoc/>
protected override void OnKeyDown(KeyEventArgs e)
{

30
tests/Perspex.Controls.UnitTests/TreeViewTests.cs

@ -128,6 +128,28 @@ namespace Perspex.Controls.UnitTests
Assert.Equal(new[] { "Foo", "Bar", "Baz " }, result);
}
[Fact]
public void Removing_Item_Should_Remove_Itself_And_Children_From_Index()
{
var tree = CreateTestTreeData();
var target = new TreeView
{
Template = CreateTreeViewTemplate(),
DataTemplates = CreateNodeDataTemplate(),
Items = tree,
};
var root = new TestRoot();
root.Child = target;
ApplyTemplates(target);
Assert.Equal(4, target.ItemContainerGenerator.Index.Items.Count());
tree[0].Children.RemoveAt(1);
Assert.Equal(2, target.ItemContainerGenerator.Index.Items.Count());
}
[Fact]
public void DataContexts_Should_Be_Correctly_Set()
{
@ -180,12 +202,12 @@ namespace Perspex.Controls.UnitTests
private IList<Node> CreateTestTreeData()
{
return new[]
return new PerspexList<Node>
{
new Node
{
Value = "Root",
Children = new[]
Children = new PerspexList<Node>
{
new Node
{
@ -194,7 +216,7 @@ namespace Perspex.Controls.UnitTests
new Node
{
Value = "Child2",
Children = new[]
Children = new PerspexList<Node>
{
new Node
{
@ -271,7 +293,7 @@ namespace Perspex.Controls.UnitTests
private class Node
{
public string Value { get; set; }
public IList<Node> Children { get; set; }
public IPerspexList<Node> Children { get; set; }
}
}
}

Loading…
Cancel
Save