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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with
27 additions and
1 deletions
src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs
tests/Avalonia.Controls.UnitTests/ItemsControlTests.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 ) ;
}
}
}
@ -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 ( )
{