Przeglądaj źródła

Merge pull request #652 from donandren/issues/651

added failing unit test for #651
Steven Kirk 9 lat temu
rodzic
commit
90460bce37

+ 2 - 2
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -116,7 +116,7 @@ namespace Avalonia.Controls.Presenters
                         CreateAndRemoveContainers();
 
                         if (e.NewStartingIndex >= FirstIndex &&
-                            e.NewStartingIndex + e.NewItems.Count <= NextIndex)
+                            e.NewStartingIndex < NextIndex)
                         {
                             RecycleContainers();
                         }
@@ -125,7 +125,7 @@ namespace Avalonia.Controls.Presenters
 
                     case NotifyCollectionChangedAction.Remove:
                         if (e.OldStartingIndex >= FirstIndex &&
-                            e.OldStartingIndex + e.OldItems.Count <= NextIndex)
+                            e.OldStartingIndex < NextIndex)
                         {
                             RecycleContainersOnRemove();
                         }

+ 105 - 1
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@@ -554,6 +554,110 @@ namespace Avalonia.Controls.UnitTests.Presenters
             }
         }
 
+        [Fact]
+        public void InsertRange_Items_Should_Update_Containers()
+        {
+            var target = CreateTarget(useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList();
+            var items = (AvaloniaList<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected, actual);
+
+            var toAdd = Enumerable.Range(0, 3).Select(x => $"New Item {x}").ToList();
+
+            int index = 1;
+
+            items.InsertRange(index, toAdd);
+            expected.InsertRange(index, toAdd);
+            expected.RemoveRange(10, toAdd.Count);
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
+        [Fact]
+        public void InsertRange_Items_Before_Last_Should_Update_Containers()
+        {
+            var target = CreateTarget(useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList();
+            var items = (AvaloniaList<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected, actual);
+
+            var toAdd = Enumerable.Range(0, 3).Select(x => $"New Item {x}").ToList();
+
+            int index = 8;
+
+            items.InsertRange(index, toAdd);
+            expected.InsertRange(index, toAdd);
+            expected.RemoveRange(10, toAdd.Count);
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
+        [Fact]
+        public void RemoveRange_Items_Should_Update_Containers()
+        {
+            var target = CreateTarget(useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 13).Select(x => $"Item {x}").ToList();
+            var items = (AvaloniaList<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected.Take(10), actual);
+
+            int index = 5;
+            int count = 3;
+
+            items.RemoveRange(index, count);
+            expected.RemoveRange(index, count);
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
+        [Fact]
+        public void RemoveRange_Items_Before_Last_Should_Update_Containers()
+        {
+            var target = CreateTarget(useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 13).Select(x => $"Item {x}").ToList();
+            var items = (AvaloniaList<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected.Take(10), actual);
+
+            int index = 8;
+            int count = 3;
+
+            items.RemoveRange(index, count);
+            expected.RemoveRange(index, count);
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
         public class Vertical
         {
             [Fact]
@@ -877,4 +981,4 @@ namespace Avalonia.Controls.UnitTests.Presenters
             }
         }
     }
-}
+}