Enlace de datos en los controles de usuario de WPF

Estoy creando un UserControl para una serie de controles compartidos por varias ventanas. Uno de los controles es una etiqueta que muestra el flujo de algún otro proceso en términos de "números de protocolo".

Estoy intentando ofrecer DataBinding con esta etiqueta para que la ventana refleje automáticamente el estado del proceso a medida que cambia la variable de número de protocolo.

Este es el control de usuario XAML:

<UserControl Name="MainOptionsPanel"
    x:Class="ExperienceMainControls.MainControls"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber}" Name="protocolNumberLabel"/>
(...)
</UserControl>

Y este es el Code-Behind:

public partial class MainControls 
{
    public MainControls()
    {
        InitializeComponent();
    }

    public int ProtocolNumber
    {
        get { return (int)GetValue(ProtocolNumberProperty); }
        set { SetValue(ProtocolNumberProperty, value); }
    }

    public static DependencyProperty ProtocolNumberProperty = 
       DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls));
}

Esto parece estar funcionando porque si en el constructor configuro ProtocolNumber en un valor arbitrario, se refleja en el control del usuario.

Sin embargo, cuando se utiliza este control de usuario en la ventana final, se rompe el enlace de datos.

XAML:

<Window x:Class="UserControlTesting.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:expControl="clr-namespace:ExperienceMainControls;assembly=ExperienceMainControls"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
    <StackPanel>
        <expControl:MainControls ProtocolNumber="{Binding Path=Number, Mode=TwoWay}" />
    </StackPanel>

</Window>

Code-Behind para ventana:

public partial class Window1 : Window
{
    public Window1()
    {
        Number= 15;
        InitializeComponent();
    }

    public int Number { get; set; }
}

Esto establece el Número de protocolo en cero, ignorando el valor establecido en Número.

He leído el ejemplo

Respuestas a la pregunta(3)

Su respuesta a la pregunta