From 47cbad7fd475e2d3cf9c6215e8e637a8670e9de0 Mon Sep 17 00:00:00 2001 From: Meloman19 Date: Tue, 25 Jun 2024 22:36:02 +0300 Subject: [PATCH] Remove from logical children and clear item container on reset (#15855) * Remove from logical children and clear item container on reset (similarly like OnItemsChanged.Remove) * Add simple test --------- Co-authored-by: Meloman19 <23280622+Meloman19@users.noreply.github.com> --- .../Presenters/PanelContainerGenerator.cs | 5 +++- .../ItemsControlTests.cs | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs b/src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs index cba729d9d2..4027cd252f 100644 --- a/src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs +++ b/src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs @@ -136,12 +136,15 @@ namespace Avalonia.Controls.Presenters return; var itemsControl = _presenter.ItemsControl; + var generator = itemsControl.ItemContainerGenerator; var panel = _presenter.Panel; foreach (var c in panel.Children) { + itemsControl.RemoveLogicalChild(c); + if (!c.IsSet(ItemIsOwnContainerProperty)) - itemsControl.RemoveLogicalChild(c); + generator.ClearItemContainer(c); } } } diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs index 40a7c21dbd..3983ac503d 100644 --- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs @@ -976,6 +976,29 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(1, raised); } + [Fact] + public void ContainerClearing_Is_Raised_When_ItemsSource_Is_Cleared() + { + using var app = Start(); + var itemsSource = new ObservableCollection { "Foo", "Bar", "Baz" }; + var target = CreateTarget(itemsSource: itemsSource); + + var expectedContainers = itemsSource.Select(x => target.ContainerFromItem(x)).ToArray(); + var actualContainers = new List(); + var raised = 0; + + target.ContainerClearing += (s, e) => + { + actualContainers.Add(e.Container); + ++raised; + }; + + itemsSource.Clear(); + + Assert.Equal(3, raised); + Assert.Equal(expectedContainers, actualContainers); + } + [Fact] public void Handles_Recycling_Control_Items_Inside_Containers() {