From 2d4151ddfea8024b3cc7e58ff9172d1f7b5cadab Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 24 May 2016 23:54:16 +0200 Subject: [PATCH] Update containers when Items changes. --- .../Presenters/ItemVirtualizerSimple.cs | 12 ++++++++++++ .../ItemsPresenterTests_Virtualization.cs | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index afbd501fc2..32fa967793 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -89,6 +89,18 @@ namespace Avalonia.Controls.Presenters public override void ItemsChanged(IEnumerable items, NotifyCollectionChangedEventArgs e) { base.ItemsChanged(items, e); + + if (e.Action == NotifyCollectionChangedAction.Reset) + { + // We could recycle items here if this proves to be inefficient, but + // Reset indicates a large change and should (?) be quite rare. + VirtualizingPanel.Children.Clear(); + Owner.ItemContainerGenerator.Clear(); + FirstIndex = 0; + LastIndex = -1; + CreateRemoveContainers(); + } + ((ILogicalScrollable)Owner).InvalidateScroll(); } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index a3fc24583c..3275c1bfba 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs @@ -184,6 +184,20 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(8, target.Panel.Children.Count); } + [Fact] + public void Should_Update_Containers_When_Items_Changes() + { + var target = CreateTarget(); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + target.Items = new[] { "foo", "bar", "baz" }; + + Assert.Equal(3, target.Panel.Children.Count); + } + public class WithContainers { [Fact]