From 63c2cd41fd100e196dc92a536215c0c385f94bc7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 18 Jun 2016 12:05:49 +0200 Subject: [PATCH] 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. --- .../Presenters/ItemVirtualizerSimple.cs | 1 + ...emsPresenterTests_Virtualization_Simple.cs | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 1dca52f885..4d792939d7 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -135,6 +135,7 @@ namespace Avalonia.Controls.Presenters case NotifyCollectionChangedAction.Reset: RecycleContainersOnRemove(); + CreateAndRemoveContainers(); break; } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 354f93097b..ffc1c4a21a 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/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)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)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]