Browse Source

Make logic a bit clearer.

pull/9677/head
Steven Kirk 4 years ago
parent
commit
08f90dcad6
  1. 27
      src/Avalonia.Controls/VirtualizingStackPanel.cs

27
src/Avalonia.Controls/VirtualizingStackPanel.cs

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

Loading…
Cancel
Save