Controle personalizado OnApplyTemplate chamado após o retorno de chamada da propriedade de dependência

Estou desenvolvendo meu primeiro controle personalizado do WPF e estou enfrentando alguns problemas, aqui está uma versão simplificada do código que estou usando atualmente:

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;
        }
    }
}

Este é o modelo do meu controle personalizado:

<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>

Então eu coloco dentro de uma grade e tento definir sua propriedade de conteúdo:

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

Aqui está o código por trás:

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";
        }
    }
}

Isso não funciona, por algum motivo, o retorno de chamada OnContentPropertyChanged é chamado antes de OnApplyTemplate, portanto, myControl._buttonElement é atribuído muito tarde e ainda é nulo ao tentar definir seu conteúdo. Por que isso está acontecendo e como posso mudar esse comportamento?

Eu também preciso fornecer suporte total ao tempo de design, mas não consigo encontrar uma maneira de fazer com que meu controle personalizado aceite alguma marcação adicional, da mesma forma que o controle Grid faz com ColumnDefinitions:

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

Qualquer ajuda seria muito apreciada!

ATUALIZAR

Eu encontrei um documento que explica por que o método OnApplyTemplate é chamado após as propriedades de controle serem definidas:

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

Portanto, a pergunta é: como posso controlar as propriedades que são definidas (em XAML ou programaticamente) e métodos que são chamados quando o controle não foi inicializado, para que eu possa definir / chamá-los quando o método OnApplyTemplate é chamado? Como o mesmo callback / método pode funcionar antes e depois da inicialização do controle sem duplicar o código?

questionAnswers(2)

yourAnswerToTheQuestion