|
@@ -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();
|