From 6e73244a1efb3c5ee4be370cadee79e790dad8af Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 2 Jun 2016 16:48:55 +0200 Subject: [PATCH] Handle move and replace in virtualized lists. --- .../Presenters/ItemVirtualizerSimple.cs | 5 +++ ...emsPresenterTests_Virtualization_Simple.cs | 45 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index fc7e36a2a1..01b1b24e43 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -104,6 +104,11 @@ namespace Avalonia.Controls.Presenters break; + case NotifyCollectionChangedAction.Move: + case NotifyCollectionChangedAction.Replace: + RecycleContainers(); + break; + case NotifyCollectionChangedAction.Reset: RecycleContainersOnRemove(); break; diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 042060b9f6..09abb85ba7 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -303,6 +303,51 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(expected, actual); } + [Fact] + public void Replacing_Items_Should_Update_Containers() + { + var target = CreateTarget(itemCount: 20); + + 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 = (ObservableCollection)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected, actual); + + items[4] = expected[4] = "Replaced"; + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + + [Fact] + public void Moving_Items_Should_Update_Containers() + { + var target = CreateTarget(itemCount: 20); + + 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 = (ObservableCollection)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected, actual); + + items.Move(4, 8); + var i = expected[4]; + expected.RemoveAt(4); + expected.Insert(8, i); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + [Fact] public void Setting_Items_To_Null_Should_Remove_Containers() {