diff --git a/src/Avalonia.Controls/VirtualizingStackPanel.cs b/src/Avalonia.Controls/VirtualizingStackPanel.cs index f211ec2edb..22526fa29c 100644 --- a/src/Avalonia.Controls/VirtualizingStackPanel.cs +++ b/src/Avalonia.Controls/VirtualizingStackPanel.cs @@ -428,7 +428,8 @@ namespace Avalonia.Controls private Control GetOrCreateElement(IList items, int index) { - var e = GetRealizedElement(index) ?? + var e = GetRealizedElement(index) ?? + GetItemIsOwnContainer(items, index) ?? GetRecycledElement(items, index) ?? CreateElement(items, index); InvalidateHack(e); @@ -442,15 +443,12 @@ namespace Avalonia.Controls return _realizedElements?.GetElement(index); } - private Control? GetRecycledElement(IList items, int index) + private Control? GetItemIsOwnContainer(IList items, int index) { - Debug.Assert(ItemsControl is not null); - - var generator = ItemsControl!.ItemContainerGenerator; - var item = items[index]; - - if (item is Control controlItem) + if (items[index] is Control controlItem) { + var generator = ItemsControl!.ItemContainerGenerator; + if (controlItem.IsSet(ItemIsOwnContainerProperty)) { controlItem.IsVisible = true; @@ -459,12 +457,23 @@ namespace Avalonia.Controls else if (generator.IsItemItsOwnContainer(controlItem)) { AddInternalChild(controlItem); - generator.PrepareItemContainer(controlItem, item, index); + generator.PrepareItemContainer(controlItem, controlItem, index); controlItem.SetValue(ItemIsOwnContainerProperty, true); return controlItem; } } + return null; + } + + private Control? GetRecycledElement(IList items, int index) + { + Debug.Assert(ItemsControl is not null); + + var generator = ItemsControl!.ItemContainerGenerator; + var item = items[index]; + + if (_recyclePool?.Count > 0) { var recycled = _recyclePool.Pop();