Wie wird eine bidirektionale Bindung für eine Eigenschaft implementiert?

Ich weiß, dass es viele Fragen zu Abhängigkeitseigenschaften gibt, und ich habe mir viele davon angesehen, aber keine scheint mein Problem zu lösen.

Ich habe ein Fenster wie dieses:

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

Where MyTextValue ist nur eine Zeichenfolge, die bei Änderungen benachrichtigt wird:

    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 ist auch ziemlich einfach:

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

Code-behind:

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

}

Soweit ich verstanden habe, sollte mein Fenster jetzt 2 TextBox-Steuerelemente haben, die miteinander verbunden sind. Wie wenn ich den Wert in einem ändere, sollte der andere aktualisiert werden.

Am Ende habe ich jedoch 2 separate TextBoxen, wobei die erste mit dem Text "Leer" beginnt und die nächste den Text "Völlig anderer Wert" enthält. So was:

Und wenn Sie den Text ändern, wird einer von beiden nicht im anderen wiedergegeben.

Ich würde erwarten, dass beide mit dem Text "Totally different value" beginnen und mit ihren Werten synchron sind (indem Änderungen an der MyTextValue-Eigenschaft in MainWindow übertragen werden und Änderungen dort gemeldet werden, werden die Änderungen dann an den weitergegeben anderes Textfeld). Was fehlt mir, um die Datenbindung in meinem Steuerelement ordnungsgemäß zu implementieren?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage