diff --git a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs index 0f2db6aa50..e630924a97 100644 --- a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs +++ b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs @@ -103,6 +103,12 @@ namespace Perspex.Controls.Generators return base.Dematerialize(startingIndex, count); } + public override IEnumerable RemoveRange(int startingIndex, int count) + { + Index.Remove(GetContainerRange(startingIndex, count)); + return base.RemoveRange(startingIndex, count); + } + /// /// Gets the data template for the specified item. /// diff --git a/src/Perspex.Controls/TreeViewItem.cs b/src/Perspex.Controls/TreeViewItem.cs index b762367105..e2d8107cfc 100644 --- a/src/Perspex.Controls/TreeViewItem.cs +++ b/src/Perspex.Controls/TreeViewItem.cs @@ -88,6 +88,12 @@ namespace Perspex.Controls _treeView = this.GetLogicalAncestors().OfType().FirstOrDefault(); } + protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) + { + base.OnDetachedFromLogicalTree(e); + ItemContainerGenerator.Clear(); + } + /// protected override void OnKeyDown(KeyEventArgs e) { diff --git a/tests/Perspex.Controls.UnitTests/TreeViewTests.cs b/tests/Perspex.Controls.UnitTests/TreeViewTests.cs index dde7dc6774..9af8a15f84 100644 --- a/tests/Perspex.Controls.UnitTests/TreeViewTests.cs +++ b/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 CreateTestTreeData() { - return new[] + return new PerspexList { new Node { Value = "Root", - Children = new[] + Children = new PerspexList { new Node { @@ -194,7 +216,7 @@ namespace Perspex.Controls.UnitTests new Node { Value = "Child2", - Children = new[] + Children = new PerspexList { new Node { @@ -271,7 +293,7 @@ namespace Perspex.Controls.UnitTests private class Node { public string Value { get; set; } - public IList Children { get; set; } + public IPerspexList Children { get; set; } } } }