Привязка WPF к переменной / DependencyProperty

Я играю с привязкой WPF и переменными. По-видимому, можно только привязать DependencyProperties. Я придумал следующее, которое отлично работает: Файл кода программной части:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public string Test
    {
        get { return (string)this.GetValue(TestProperty); }
        set { this.SetValue(TestProperty, value); }
        //set { this.SetValue(TestProperty, "BBB"); }
    }
    public static readonly DependencyProperty TestProperty = DependencyProperty.Register(
      "Test", typeof(string), typeof(MainWindow), new PropertyMetadata("CCC"));

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Test);
        Test = "AAA";
        MessageBox.Show(Test);
    }
}

XAML:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,86,0,0" Name="textBox1" VerticalAlignment="Top" Width="152" 
             Text="{Binding Test, Mode=TwoWay, diag:PresentationTraceSources.TraceLevel=High}"/>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="320,85,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox Height="31" HorizontalAlignment="Left" Margin="84,138,0,0" Name="textBox2" Text="{Binding Test, Mode=TwoWay}" VerticalAlignment="Top" Width="152" />
</Grid>

Два текстовых поля обновляют друг друга. И Button устанавливает их в «AAA».

Но теперь я заменил функцию Setter на ту, которая закомментирована (имитируя некоторые манипуляции с заданным значением). Я ожидал, что всякий раз, когда значение свойства будет изменено, оно будет сброшено на «BBB». Это происходит, когда вы нажимаете кнопку, то есть когда вы устанавливаете свойство в коде. Но по какой-то причине это не влияет на привязки WPF, то есть вы можете изменить содержимое TextBox и, следовательно, свойство, но, по-видимому, Setter никогда не вызывается. Мне интересно, почему это так, и как можно добиться ожидаемого поведения.

6
задан Fredrik Hedblad 1 January 2011 в 20:46
поделиться