Jelajahi Sumber

Failing test for selection w/ virtualization.

Steven Kirk 2 tahun lalu
induk
melakukan
5391361d45

+ 35 - 0
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_Multiple.cs

@@ -1074,6 +1074,40 @@ namespace Avalonia.Controls.UnitTests.Primitives
             Assert.Equal(new[] { items[2] }, target.Selection.SelectedItems);
         }
 
+        [Fact]
+        public void Selection_Is_Not_Cleared_On_Recycling_Containers()
+        {
+            using var app = Start();
+            var items = Enumerable.Range(0, 100).Select(x => new ItemViewModel($"Item {x}", false)).ToList();
+
+            // Create a SelectingItemsControl that creates containers that raise IsSelectedChanged,
+            // with a virtualizing stack panel.
+            var target = CreateTarget<TestSelectorWithContainers>(
+                itemsSource: items, 
+                virtualizing: true);
+            target.AutoScrollToSelectedItem = false;
+
+            var panel = Assert.IsType<VirtualizingStackPanel>(target.ItemsPanelRoot);
+            var scroll = panel.FindAncestorOfType<ScrollViewer>()!;
+
+            // Select item 1.
+            target.SelectedIndex = 1;
+
+            // Scroll item 1 out of view.
+            scroll.Offset = new(0, 1000);
+            Layout(target);
+
+            Assert.Equal(10, panel.FirstRealizedIndex);
+            Assert.Equal(19, panel.LastRealizedIndex);
+
+            // The selection should be preserved.
+            Assert.Empty(SelectedContainers(target));
+            Assert.Equal(1, target.SelectedIndex);
+            Assert.Same(items[1], target.SelectedItem);
+            Assert.Equal(new[] { 1 }, target.Selection.SelectedIndexes);
+            Assert.Equal(new[] { items[1] }, target.Selection.SelectedItems);
+        }
+
         [Fact]
         public void Selection_State_Change_On_Unrealized_Item_Is_Respected_With_IsSelected_Binding()
         {
@@ -1248,6 +1282,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
                 Setters =
                 {
                     new Setter(TestContainer.TemplateProperty, CreateTestContainerTemplate()),
+                    new Setter(TestContainer.HeightProperty, 100.0),
                 },
             };
         }