|
|
@ -109,11 +109,10 @@ namespace Avalonia.Controls |
|
|
|
|
|
|
|
|
public void ClearElementToElementFactory(IControl element) |
|
|
public void ClearElementToElementFactory(IControl element) |
|
|
{ |
|
|
{ |
|
|
var virtInfo = ItemsRepeater.GetVirtualizationInfo(element); |
|
|
|
|
|
var clearedIndex = virtInfo.Index; |
|
|
|
|
|
_owner.OnElementClearing(element); |
|
|
_owner.OnElementClearing(element); |
|
|
_owner.ItemTemplateShim.RecycleElement(_owner, element); |
|
|
_owner.ItemTemplateShim?.RecycleElement(_owner, element); |
|
|
|
|
|
|
|
|
|
|
|
var virtInfo = ItemsRepeater.GetVirtualizationInfo(element); |
|
|
virtInfo.MoveOwnershipToElementFactory(); |
|
|
virtInfo.MoveOwnershipToElementFactory(); |
|
|
|
|
|
|
|
|
if (_lastFocusedElement == element) |
|
|
if (_lastFocusedElement == element) |
|
|
@ -121,9 +120,8 @@ namespace Avalonia.Controls |
|
|
// Focused element is going away. Remove the tracked last focused element
|
|
|
// Focused element is going away. Remove the tracked last focused element
|
|
|
// and pick a reasonable next focus if we can find one within the layout
|
|
|
// and pick a reasonable next focus if we can find one within the layout
|
|
|
// realized elements.
|
|
|
// realized elements.
|
|
|
MoveFocusFromClearedIndex(clearedIndex); |
|
|
MoveFocusFromClearedIndex(virtInfo.Index); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void MoveFocusFromClearedIndex(int clearedIndex) |
|
|
private void MoveFocusFromClearedIndex(int clearedIndex) |
|
|
@ -518,18 +516,32 @@ namespace Avalonia.Controls |
|
|
private IControl GetElementFromElementFactory(int index) |
|
|
private IControl GetElementFromElementFactory(int index) |
|
|
{ |
|
|
{ |
|
|
// The view generator is the provider of last resort.
|
|
|
// The view generator is the provider of last resort.
|
|
|
|
|
|
var data = _owner.ItemsSourceView.GetAt(index); |
|
|
var itemTemplateFactory = _owner.ItemTemplateShim; |
|
|
var itemTemplateFactory = _owner.ItemTemplateShim; |
|
|
|
|
|
IControl element = null; |
|
|
|
|
|
var itemsSourceContainsElements = false; |
|
|
|
|
|
|
|
|
if (itemTemplateFactory == null) |
|
|
if (itemTemplateFactory == null) |
|
|
{ |
|
|
{ |
|
|
// If no ItemTemplate was provided, use a default
|
|
|
element = data as IControl; |
|
|
var factory = FuncDataTemplate.Default; |
|
|
|
|
|
_owner.ItemTemplate = factory; |
|
|
// No item template provided and ItemsSource contains objects derived from UIElement.
|
|
|
itemTemplateFactory = _owner.ItemTemplateShim; |
|
|
// In this case, just use the data directly as elements.
|
|
|
|
|
|
itemsSourceContainsElements = element != null; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var data = _owner.ItemsSourceView.GetAt(index); |
|
|
if (element == null) |
|
|
var element = itemTemplateFactory.GetElement(_owner, data); |
|
|
{ |
|
|
|
|
|
if (itemTemplateFactory == null) |
|
|
|
|
|
{ |
|
|
|
|
|
// If no ItemTemplate was provided, use a default
|
|
|
|
|
|
var factory = FuncDataTemplate.Default; |
|
|
|
|
|
_owner.ItemTemplate = factory; |
|
|
|
|
|
itemTemplateFactory = _owner.ItemTemplateShim; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
element = itemTemplateFactory.GetElement(_owner, data); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
var virtInfo = ItemsRepeater.TryGetVirtualizationInfo(element); |
|
|
var virtInfo = ItemsRepeater.TryGetVirtualizationInfo(element); |
|
|
if (virtInfo == null) |
|
|
if (virtInfo == null) |
|
|
@ -537,8 +549,11 @@ namespace Avalonia.Controls |
|
|
virtInfo = ItemsRepeater.CreateAndInitializeVirtualizationInfo(element); |
|
|
virtInfo = ItemsRepeater.CreateAndInitializeVirtualizationInfo(element); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Prepare the element
|
|
|
if (!itemsSourceContainsElements) |
|
|
element.DataContext = data; |
|
|
{ |
|
|
|
|
|
// Prepare the element
|
|
|
|
|
|
element.DataContext = data; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
virtInfo.MoveOwnershipToLayoutFromElementFactory( |
|
|
virtInfo.MoveOwnershipToLayoutFromElementFactory( |
|
|
index, |
|
|
index, |
|
|
|