Browse Source

Prepare new containers before adding to tree.

Prevents compiled bindings failing because the `DataContext` is not yet set and is still inheriting the parent `DataContext`.
pull/9677/head
Steven Kirk 3 years ago
parent
commit
0b3aa3a84b
  1. 12
      src/Avalonia.Controls/ItemsControl.cs
  2. 2
      src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs
  3. 4
      src/Avalonia.Controls/VirtualizingCarouselPanel.cs

12
src/Avalonia.Controls/ItemsControl.cs

@ -313,9 +313,9 @@ namespace Avalonia.Controls
hic.Header = item;
hic.HeaderTemplate = itemTemplate;
var treeTemplate = (itemTemplate ?? hic.FindDataTemplate(item)) as ITreeDataTemplate;
itemTemplate ??= hic.FindDataTemplate(item) ?? this.FindDataTemplate(item);
if (treeTemplate is not null)
if (itemTemplate is ITreeDataTemplate treeTemplate)
{
if (item is not null && treeTemplate.ItemsSelector(item) is { } itemsBinding)
BindingOperations.Apply(hic, ItemsProperty, itemsBinding, null);
@ -481,14 +481,6 @@ namespace Avalonia.Controls
internal void PrepareItemContainer(Control container, object? item, int index)
{
// Putting this precondition in place in case we want to raise an event when a
// container is realized. If we want to do that, then the event subscriber will expect
// the container to be attached to the tree. Not using IsAttachedToVisualTree here
// because a bunch of tests don't have a rooted visual tree.
if (container.GetVisualParent() is null)
throw new InvalidOperationException(
"Container must be attached to parent before PrepareItemContainer is called.");
var itemContainerTheme = ItemContainerTheme;
if (itemContainerTheme is not null &&

2
src/Avalonia.Controls/Presenters/PanelContainerGenerator.cs

@ -137,9 +137,9 @@ namespace Avalonia.Controls.Presenters
container = generator.CreateContainer();
}
generator.PrepareItemContainer(container, item, index);
itemsControl.AddLogicalChild(container);
children.Insert(index, container);
generator.PrepareItemContainer(container, item, index);
}
private void ClearItemsControlLogicalChildren()

4
src/Avalonia.Controls/VirtualizingCarouselPanel.cs

@ -275,8 +275,8 @@ namespace Avalonia.Controls
}
else if (generator.IsItemItsOwnContainer(controlItem))
{
AddInternalChild(controlItem);
generator.PrepareItemContainer(controlItem, controlItem, index);
AddInternalChild(controlItem);
controlItem.SetValue(ItemIsOwnContainerProperty, true);
return controlItem;
}
@ -311,8 +311,8 @@ namespace Avalonia.Controls
var item = items[index];
var container = generator.CreateContainer();
AddInternalChild(container);
generator.PrepareItemContainer(container, item, index);
AddInternalChild(container);
return container;
}

Loading…
Cancel
Save