Browse Source

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>
pull/16129/head
Meloman19 2 years ago
committed by GitHub
parent
commit
47cbad7fd4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs
  2. 23
      tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs

5
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);
}
}
}

23
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<object> { "Foo", "Bar", "Baz" };
var target = CreateTarget(itemsSource: itemsSource);
var expectedContainers = itemsSource.Select(x => target.ContainerFromItem(x)).ToArray();
var actualContainers = new List<Control>();
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()
{

Loading…
Cancel
Save