Пользовательский элемент управления OnApplyTemplate вызывается после обратного вызова свойства зависимостей

Я разрабатываю свой первый пользовательский элемент управления WPF и сталкиваюсь с некоторыми проблемами, вот упрощенная версия кода, который я в настоящее время использую:

using System.Windows;
using System.Windows.Controls;

namespace MyControls
{
    [TemplatePart(Name = "PART_Button", Type = typeof (Button))]
    public class MyControl : Control
    {
        public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyControl), new PropertyMetadata(null, OnLabelPropertyChanged));

        private Button _buttonElement;

        public object Content
        {
            get { return this.GetValue(LabelProperty); }
            set { this.SetValue(ContentProperty, value); }
        }

        static MyControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof (MyControl), new FrameworkPropertyMetadata(typeof (MyControl)));
        }

        private static void OnContentPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            MyControl myControl = sender as MyControl;
            if (myControl != null && myControl._buttonElement != null)
                myControl._buttonElement.Content = e.NewValue;
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            this._buttonElement = this.Template.FindName("PART_Button", this) as Button;
        }
    }
}

Это шаблон для моего пользовательского элемента управления:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MyControls">
    <Style TargetType="{x:Type local:MyControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MyControl}">
                    <Button x:Name="PART_Button" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Затем я помещаю его в сетку и пытаюсь установить его свойство Content:

<Grid x:Name="layoutRoot">
    <controls:MyControl x:Name="myControl" />
</Grid>

Вот код позади:

using System.Windows;

namespace MyControls
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();

            this.myControl.Content = "test";
        }
    }
}

Это не работает, по какой-то причине обратный вызов OnContentPropertyChanged вызывается перед OnApplyTemplate, поэтому myControl._buttonElement назначается слишком поздно, и он по-прежнему равен нулю при попытке установить его содержимое. Почему это происходит и как я могу изменить это поведение?

Мне также необходимо обеспечить полную поддержку во время разработки, но я не могу найти способ заставить мой настраиваемый элемент управления принять некоторую дополнительную разметку, во многом так же, как элемент управления Grid делает с ColumnDefinitions:

<Grid x:Name="layoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
</Grid>

Любая помощь будет принята с благодарностью!

UPDATE

Я нашел документ, который объясняет, почему метод OnApplyTemplate вызывается после установки свойств элемента управления:

http://msdn.microsoft.com/en-us/library/dd351483%28v=vs.95%29.aspx

Поэтому возникает вопрос: как я могу отслеживать установленные свойства (в XAML или программно) и методы, которые вызываются, когда элемент управления не был инициализирован, чтобы я мог устанавливать / вызывать их при вызове метода OnApplyTemplate? Как один и тот же обратный вызов / метод может работать как до, так и после инициализации элемента управления без дублирования кода?

Ответы на вопрос(2)

Ваш ответ на вопрос