Browse Source

More work on items removed.

Steven Kirk 9 years ago
parent
commit
7ca7f53537

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

@@ -272,10 +272,8 @@ namespace Avalonia.Controls.Presenters
                 {
                     RecycleContainersForMove(delta);
                 }
-                else
-                {
-                    RecycleContainers();
-                }
+
+                RecycleContainers();
             }
         }
 

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

@@ -254,7 +254,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
         }
 
         [Fact]
-        public void Removing_Items_When_Scrolled_To_End_Should_Add_Containers_At_Top()
+        public void Removing_Items_When_Scrolled_To_End_Should_Recyle_Containers_At_Top()
         {
             var target = CreateTarget(itemCount: 20, useAvaloniaList: true);
 
@@ -277,6 +277,32 @@ namespace Avalonia.Controls.UnitTests.Presenters
             Assert.Equal(expected, actual);
         }
 
+        [Fact]
+        public void Removing_Items_When_Scrolled_To_Near_End_Should_Recycle_Containers_At_Bottom_And_Top()
+        {
+            var target = CreateTarget(itemCount: 20, useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            ((ILogicalScrollable)target).Offset = new Vector(0, 9);
+
+            var expected = Enumerable.Range(9, 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);
+
+            items.RemoveRange(15, 3);
+            expected = Enumerable.Range(7, 8).Select(x => $"Item {x}")
+                .Concat(Enumerable.Range(18, 2).Select(x => $"Item {x}"))
+                .ToList();
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
         [Fact]
         public void Setting_Items_To_Null_Should_Remove_Containers()
         {