Browse Source

Add containers on Items reset.

If new items have been added on Reset and the panel was not previously
full, then create containers for the new items. Fixes #561.
Steven Kirk 9 years ago
parent
commit
63c2cd41fd

+ 1 - 0
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -135,6 +135,7 @@ namespace Avalonia.Controls.Presenters
 
                     case NotifyCollectionChangedAction.Reset:
                         RecycleContainersOnRemove();
+                        CreateAndRemoveContainers();
                         break;
                 }
             }

+ 44 - 0
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@@ -372,6 +372,50 @@ namespace Avalonia.Controls.UnitTests.Presenters
             Assert.Empty(target.Panel.Children);
         }
 
+        [Fact]
+        public void Reassigning_Items_Should_Create_Containers()
+        {
+            var target = CreateTarget(itemCount: 5);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 5).Select(x => $"Item {x}").ToList();
+            var items = (ObservableCollection<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected, actual);
+
+            expected = Enumerable.Range(0, 6).Select(x => $"Item {x}").ToList();
+            target.Items = expected;
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
+        [Fact]
+        public void Reassigning_Items_Should_Remove_Containers()
+        {
+            var target = CreateTarget(itemCount: 5);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            var expected = Enumerable.Range(0, 5).Select(x => $"Item {x}").ToList();
+            var items = (ObservableCollection<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected, actual);
+
+            expected = Enumerable.Range(0, 4).Select(x => $"Item {x}").ToList();
+            target.Items = expected;
+
+            actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+            Assert.Equal(expected, actual);
+        }
+
         public class Vertical
         {
             [Fact]