Я играю с WPF Binding и переменными. Видимо, можно связать только 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>
Два текстовых поля обновляют друг друга. И Кнопка устанавливает их на «AAA».
Но теперь я заменил функцию Setter на закомментированную (имитирующую некоторые манипуляции с данным значением). Я ожидаю, что всякий раз, когда значение свойства изменяется, оно сбрасывается на «BBB». Это происходит при нажатии кнопки, то есть при установке свойства в коде. Но это по какой-то причине не влияет на привязки WPF, то есть вы можете изменить содержимое TextBox и, следовательно, его свойство, но, очевидно, метод Setter никогда не вызывается.
Интересно, почему это так, и как можно достичь ожидаемого поведения?