diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 938ba3c78d..7e7778a3fa 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -110,10 +110,11 @@ namespace Avalonia.Controls.Presenters switch (e.Action) { case NotifyCollectionChangedAction.Add: + CreateAndRemoveContainers(); + if (e.NewStartingIndex >= FirstIndex && e.NewStartingIndex + e.NewItems.Count <= NextIndex) { - CreateAndRemoveContainers(); RecycleContainers(); } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index f04684a5f0..e3614e152b 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -62,6 +62,23 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(new Size(10, 0), ((ILogicalScrollable)target).Viewport); } + [Fact] + public void Should_Add_Containers_When_Panel_Is_Not_Full() + { + var target = CreateTarget(itemCount: 5); + var items = (IList)target.Items; + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(5, target.Panel.Children.Count); + + items.Add("New Item"); + + Assert.Equal(6, target.Panel.Children.Count); + } + [Fact] public void Should_Remove_Items_When_Control_Is_Shrank() {