Browse Source

Make logic a bit clearer.

Steven Kirk 2 years ago
parent
commit
08f90dcad6
1 changed files with 18 additions and 9 deletions
  1. 18 9
      src/Avalonia.Controls/VirtualizingStackPanel.cs

+ 18 - 9
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();