Я играю с привязкой 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 никогда не вызывается. Мне интересно, почему это так, и как можно добиться ожидаемого поведения.