Browse Source

Ensure TreeViewItems are removed from index.

When TreeViewItem is removed from TreeView.
Steven Kirk 10 years ago
parent
commit
3bfba9c8ce

+ 6 - 0
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 - 0
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)
         {

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