diff --git a/src/Avalonia.Controls/ContentControl.cs b/src/Avalonia.Controls/ContentControl.cs
index 6da6da54a5..16f17ae1bd 100644
--- a/src/Avalonia.Controls/ContentControl.cs
+++ b/src/Avalonia.Controls/ContentControl.cs
@@ -97,7 +97,19 @@ namespace Avalonia.Controls
///
void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
- Presenter = presenter;
+ RegisterContentPresenter(presenter);
+ }
+
+ ///
+ /// Called when an is registered with the control.
+ ///
+ /// The presenter.
+ protected virtual void RegisterContentPresenter(IContentPresenter presenter)
+ {
+ if (presenter.Name == "PART_ContentPresenter")
+ {
+ Presenter = presenter;
+ }
}
}
}
diff --git a/src/Avalonia.Controls/Primitives/HeaderedContentControl.cs b/src/Avalonia.Controls/Primitives/HeaderedContentControl.cs
index 7a46e0f776..98476c9c94 100644
--- a/src/Avalonia.Controls/Primitives/HeaderedContentControl.cs
+++ b/src/Avalonia.Controls/Primitives/HeaderedContentControl.cs
@@ -1,6 +1,8 @@
// 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.Controls.Mixins;
+using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
namespace Avalonia.Controls.Primitives
@@ -20,7 +22,18 @@ namespace Avalonia.Controls.Primitives
/// Defines the property.
///
public static readonly StyledProperty HeaderTemplateProperty =
- AvaloniaProperty.Register(nameof(HeaderTemplate));
+ AvaloniaProperty.Register(nameof(HeaderTemplate));
+
+ ///
+ /// Initializes static members of the class.
+ ///
+ static HeaderedContentControl()
+ {
+ ContentControlMixin.Attach(
+ HeaderProperty,
+ x => x.LogicalChildren,
+ "PART_HeaderPresenter");
+ }
///
/// Gets or sets the header content.
@@ -29,7 +42,16 @@ namespace Avalonia.Controls.Primitives
{
get { return GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
- }
+ }
+
+ ///
+ /// Gets the header presenter from the control's template.
+ ///
+ public IContentPresenter HeaderPresenter
+ {
+ get;
+ private set;
+ }
///
/// Gets or sets the data template used to display the header content of the control.
@@ -39,5 +61,16 @@ namespace Avalonia.Controls.Primitives
get { return GetValue(HeaderTemplateProperty); }
set { SetValue(HeaderTemplateProperty, value); }
}
+
+ ///
+ protected override void RegisterContentPresenter(IContentPresenter presenter)
+ {
+ base.RegisterContentPresenter(presenter);
+
+ if (presenter.Name == "PART_HeaderPresenter")
+ {
+ HeaderPresenter = presenter;
+ }
+ }
}
}
diff --git a/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs b/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
index c5aa73e56a..bda426c23b 100644
--- a/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
@@ -9,7 +9,7 @@ namespace Avalonia.Controls.Primitives
///
/// Represents an with a related header.
///
- public class HeaderedItemsControl : ItemsControl
+ public class HeaderedItemsControl : ItemsControl, IContentPresenterHost
{
///
/// Defines the property.
@@ -40,17 +40,28 @@ namespace Avalonia.Controls.Primitives
///
/// Gets the header presenter from the control's template.
///
- public ContentPresenter HeaderPresenter
+ public IContentPresenter HeaderPresenter
{
get;
private set;
}
///
- protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
+ void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
- HeaderPresenter = e.NameScope.Find("PART_HeaderPresenter");
- base.OnTemplateApplied(e);
+ RegisterContentPresenter(presenter);
+ }
+
+ ///
+ /// Called when an is registered with the control.
+ ///
+ /// The presenter.
+ protected virtual void RegisterContentPresenter(IContentPresenter presenter)
+ {
+ if (presenter.Name == "PART_HeaderPresenter")
+ {
+ HeaderPresenter = presenter;
+ }
}
}
}
diff --git a/src/Avalonia.Controls/Primitives/HeaderedSelectingControl.cs b/src/Avalonia.Controls/Primitives/HeaderedSelectingItemsControl.cs
similarity index 71%
rename from src/Avalonia.Controls/Primitives/HeaderedSelectingControl.cs
rename to src/Avalonia.Controls/Primitives/HeaderedSelectingItemsControl.cs
index 87bb079ae7..d59be66b2b 100644
--- a/src/Avalonia.Controls/Primitives/HeaderedSelectingControl.cs
+++ b/src/Avalonia.Controls/Primitives/HeaderedSelectingItemsControl.cs
@@ -9,7 +9,7 @@ namespace Avalonia.Controls.Primitives
///
/// Represents a with a related header.
///
- public class HeaderedSelectingItemsControl : SelectingItemsControl
+ public class HeaderedSelectingItemsControl : SelectingItemsControl, IContentPresenterHost
{
///
/// Defines the property.
@@ -40,17 +40,28 @@ namespace Avalonia.Controls.Primitives
///
/// Gets the header presenter from the control's template.
///
- public ContentPresenter HeaderPresenter
+ public IContentPresenter HeaderPresenter
{
get;
private set;
}
///
- protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
+ void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
- base.OnTemplateApplied(e);
- HeaderPresenter = e.NameScope.Find("PART_HeaderPresenter");
+ RegisterContentPresenter(presenter);
+ }
+
+ ///
+ /// Called when an is registered with the control.
+ ///
+ /// The presenter.
+ protected virtual void RegisterContentPresenter(IContentPresenter presenter)
+ {
+ if (presenter.Name == "PART_HeaderPresenter")
+ {
+ HeaderPresenter = presenter;
+ }
}
}
}
diff --git a/tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs b/tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs
index 570d619963..66789ef874 100644
--- a/tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs
+++ b/tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs
@@ -37,7 +37,7 @@ namespace Avalonia.Controls.UnitTests
target.Header = "Foo";
target.ApplyTemplate();
- target.HeaderPresenter.UpdateChild();
+ ((ContentPresenter)target.HeaderPresenter).UpdateChild();
var child = target.HeaderPresenter.Child;
diff --git a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs
index 5d42699d3f..ef49bd2f5c 100644
--- a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs
+++ b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs
@@ -18,7 +18,10 @@ namespace Avalonia.UnitTests
public TestTemplatedRoot()
{
- Template = new FuncControlTemplate(x => new ContentPresenter());
+ Template = new FuncControlTemplate(x => new ContentPresenter
+ {
+ Name = "PART_ContentPresenter",
+ });
}
public event EventHandler Registered