// Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. using Avalonia.Collections; using Avalonia.Controls.Mixins; using Avalonia.Controls.Presenters; using Avalonia.LogicalTree; namespace Avalonia.Controls.Primitives { /// /// Represents an with a related header. /// public class HeaderedItemsControl : ItemsControl, IContentPresenterHost { /// /// Defines the property. /// public static readonly StyledProperty HeaderProperty = HeaderedContentControl.HeaderProperty.AddOwner(); /// /// Initializes static members of the class. /// static HeaderedItemsControl() { HeaderProperty.Changed.AddClassHandler((x, e) => x.HeaderChanged(e)); } /// /// Gets or sets the content of the control's header. /// public object Header { get { return GetValue(HeaderProperty); } set { SetValue(HeaderProperty, value); } } /// /// Gets the header presenter from the control's template. /// public IContentPresenter HeaderPresenter { get; private set; } /// IAvaloniaList IContentPresenterHost.LogicalChildren => LogicalChildren; /// bool IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter) { return RegisterContentPresenter(presenter); } /// /// Called when an is registered with the control. /// /// The presenter. protected virtual bool RegisterContentPresenter(IContentPresenter presenter) { if (presenter.Name == "PART_HeaderPresenter") { HeaderPresenter = presenter; return true; } return false; } private void HeaderChanged(AvaloniaPropertyChangedEventArgs e) { if (e.OldValue is ILogical oldChild) { LogicalChildren.Remove(oldChild); } if (e.NewValue is ILogical newChild) { LogicalChildren.Add(newChild); } } } }