Control personalizado OnApplyTemplate llamado después de devolución de llamada de propiedad de dependencia

Estoy desarrollando mi primer control personalizado de WPF y estoy enfrentando algunos problemas, aquí hay una versión simplificada del código que estoy usando actualmente:

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

Esta es la plantilla para mi control 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>

Luego lo puse dentro de una cuadrícula e intento establecer su propiedad de contenido:

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

Aquí está el código detrá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";
        }
    }
}

Esto no funciona, por alguna razón, la devolución de llamada OnContentPropertyChanged se llama antes que OnApplyTemplate, por lo que myControl._buttonElement se asigna demasiado tarde y aún es nulo al intentar establecer su contenido. ¿Por qué sucede esto y cómo puedo cambiar este comportamiento?

También necesito proporcionar soporte de tiempo completo de diseño, pero no puedo encontrar una manera de hacer que mi control personalizado acepte un margen de beneficio adicional, como lo hace el control Grid con ColumnDefinitions:

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

Cualquier ayuda sería muy apreciada!

ACTUALIZAR

Encontré un documento que explica por qué se llama al método OnApplyTemplate después de establecer las propiedades de control:

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

Entonces, la pregunta es: ¿cómo puedo hacer un seguimiento de las propiedades que se configuran (en XAML o mediante programación) y los métodos que se llaman cuando el control no se ha inicializado, de modo que puedo establecerlos / llamarlos cuando se llama al método OnApplyTemplate? ¿Cómo puede funcionar el mismo método / devolución de llamada antes y después de la inicialización del control sin duplicar el código?

Respuestas a la pregunta(2)

Su respuesta a la pregunta