diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs
index 9483f98881..bebf4a38f6 100644
--- a/src/Avalonia.Controls/ItemsControl.cs
+++ b/src/Avalonia.Controls/ItemsControl.cs
@@ -383,14 +383,7 @@ namespace Avalonia.Controls
{
hic.Header = item;
hic.HeaderTemplate = itemTemplate;
-
- itemTemplate ??= hic.FindDataTemplate(item) ?? this.FindDataTemplate(item);
-
- if (itemTemplate is ITreeDataTemplate treeTemplate)
- {
- if (item is not null && treeTemplate.ItemsSelector(item) is { } itemsBinding)
- BindingOperations.Apply(hic, ItemsProperty, itemsBinding, null);
- }
+ hic.PrepareItemContainer();
}
}
diff --git a/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs b/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
index 71ae7a5bf6..55d2ec7506 100644
--- a/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
@@ -1,6 +1,8 @@
+using System;
using Avalonia.Collections;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
+using Avalonia.Data;
using Avalonia.LogicalTree;
namespace Avalonia.Controls.Primitives
@@ -10,6 +12,9 @@ namespace Avalonia.Controls.Primitives
///
public class HeaderedItemsControl : ItemsControl, IContentPresenterHost
{
+ private IDisposable? _itemsBinding;
+ private bool _prepareItemContainerOnAttach;
+
///
/// Defines the property.
///
@@ -60,6 +65,17 @@ namespace Avalonia.Controls.Primitives
///
IAvaloniaList IContentPresenterHost.LogicalChildren => LogicalChildren;
+ protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
+ {
+ base.OnAttachedToLogicalTree(e);
+
+ if (_prepareItemContainerOnAttach)
+ {
+ PrepareItemContainer();
+ _prepareItemContainerOnAttach = false;
+ }
+ }
+
///
bool IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
@@ -81,6 +97,37 @@ namespace Avalonia.Controls.Primitives
return false;
}
+ internal void PrepareItemContainer()
+ {
+ _itemsBinding?.Dispose();
+ _itemsBinding = null;
+
+ var item = Header;
+
+ if (item is null)
+ {
+ _prepareItemContainerOnAttach = false;
+ return;
+ }
+
+ var headerTemplate = HeaderTemplate;
+
+ if (headerTemplate is null)
+ {
+ if (((ILogical)this).IsAttachedToLogicalTree)
+ headerTemplate = this.FindDataTemplate(item);
+ else
+ _prepareItemContainerOnAttach = true;
+ }
+
+ if (headerTemplate is ITreeDataTemplate treeTemplate &&
+ treeTemplate.Match(item) &&
+ treeTemplate.ItemsSelector(item) is { } itemsBinding)
+ {
+ _itemsBinding = BindingOperations.Apply(this, ItemsProperty, itemsBinding, null);
+ }
+ }
+
private void HeaderChanged(AvaloniaPropertyChangedEventArgs e)
{
if (e.OldValue is ILogical oldChild)