@ -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
/// </summary>
public class HeaderedItemsControl : ItemsControl , IContentPresenterHost
{
private IDisposable ? _ itemsBinding ;
private bool _ prepareItemContainerOnAttach ;
/// <summary>
/// Defines the <see cref="Header"/> property.
/// </summary>
@ -60,6 +65,17 @@ namespace Avalonia.Controls.Primitives
/// <inheritdoc/>
IAvaloniaList < ILogical > IContentPresenterHost . LogicalChildren = > LogicalChildren ;
protected override void OnAttachedToLogicalTree ( LogicalTreeAttachmentEventArgs e )
{
base . OnAttachedToLogicalTree ( e ) ;
if ( _ prepareItemContainerOnAttach )
{
PrepareItemContainer ( ) ;
_ prepareItemContainerOnAttach = false ;
}
}
/// <inheritdoc/>
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 )