Browse Source

update to repeater to allow passing in uielements in itemssource

* minor update to repeater to allow passing in uielements in itemssource

* minor fixes

Ported from 95d5ff0076
pull/3424/head
Steven Kirk 6 years ago
parent
commit
4cca4f0e4c
  1. 43
      src/Avalonia.Controls/Repeater/ViewManager.cs

43
src/Avalonia.Controls/Repeater/ViewManager.cs

@ -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,

Loading…
Cancel
Save