Como implementar a ligação bidirecional em uma propriedade?

Sei que há muitas perguntas sobre propriedades de dependência e já examinei muitas delas, mas nenhuma delas parece resolver o meu problema.

Eu tenho uma janela como esta:

<Window x:Class="WpfBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfBindingTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel>
        <local:TextInputWrapper MyText="{Binding MyTextValue, Mode=TwoWay}" />
        <TextBox Text="{Binding MyTextValue, Mode=TwoWay}"/>
    </StackPanel>
</Window>

Onde MyTextValue é apenas uma propriedade de string que notifica quando alterada:

    private string _myTextValue = "Totally different value";
    public string MyTextValue { get { return _myTextValue; } set { _myTextValue = value; OnPropertyChanged(); } }
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

TextInputWrapper também é bastante simples:

<UserControl x:Class="WpfBindingTest.TextInputWrapper"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfBindingTest"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <TextBox Text="{Binding MyText}"></TextBox>
</UserControl>

Código por trás:

public partial class TextInputWrapper : UserControl
{
    public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register("MyText",
        typeof(string), typeof(TextInputWrapper), new PropertyMetadata("Empty"));
    public TextInputWrapper()
    {
        InitializeComponent();
    }
    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }

}

Agora, tanto quanto eu entendi, minha janela agora deve ter 2 controles TextBox que estão vinculados um ao outro. Como se eu alterasse o valor em um, o outro deveria ser atualizado.

No entanto, acabo com 2 TextBoxes separados, onde o primeiro começa com o texto "Vazio" e o próximo tem o texto "Valor totalmente diferente". Como isso:

E alterar o texto em um deles não se reproduz no outro.

Eu esperava que os dois começassem com o texto "Valor totalmente diferente" e estivessem sincronizados com seus valores (propagando alterações na propriedade MyTextValue na MainWindow e notificando a alteração lá, a alteração seria propagada para a outra caixa de texto). O que estou faltando para implementar corretamente a ligação de dados em meu controle?

questionAnswers(2)

yourAnswerToTheQuestion