Зачем использовать INotifyPropertyChanged с привязками в WPF?
Я отмечал, что практически каждый пример, который я нахожу в Интернете о связываниях, имеет класс (который связывается с другим свойством), который наследует интерфейс INotifyPropertyChanged и использует метод в заданной части класса. имущество.
Я пытался удалить эту часть из примера привязки, и она работала так же, как и в случае с методом.
Вот пример. Я изменил его так, чтобы это был режим привязки TwoWay, и отобразил измененное свойство в окне сообщения.
Я сделал это просто для того, чтобы немного поиграться с привязками, но теперь я действительно не знаю, почему используется этот интерфейс
XAML:
<code><Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="40"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="100"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> <ColumnDefinition Width="30"/> </Grid.ColumnDefinitions> <Button Grid.Row="5" Grid.Column="5" Name="btnBinding" Click="btnBinding_Click" Width="100" Height="30"> <Grid HorizontalAlignment="Left" VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="25"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> <ColumnDefinition Width="50"/> </Grid.ColumnDefinitions> <TextBox Name="txtBinding" Width="30" Height="25" HorizontalAlignment="Left"/> <Label Grid.Column="1" Content="Bind"/> </Grid> </Button> <Button Grid.Column="5" Grid.Row="6" Name="btnMessage" Click="btnMessage_Click" Content="MessageBox"/> <Button Grid.Column="5" Grid.Row="4" Name="btnChangeproperty" Click="btnChangeproperty_Click" Content="Change Property"/> </Grid> </Window> </code>
Main.cs:
<code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { Binding bind; MyData mydata; public MainWindow() { InitializeComponent(); } private void btnBinding_Click(object sender, RoutedEventArgs e) { mydata = new MyData("T"); bind = new Binding("MyDataProperty") { Source = mydata, Mode = BindingMode.TwoWay }; txtBinding.SetBinding(TextBox.TextProperty, bind); } private void btnMessage_Click(object sender, RoutedEventArgs e) { MessageBox.Show(mydata.MyDataProperty); } private void btnChangeproperty_Click(object sender, RoutedEventArgs e) { mydata.MyDataProperty = "New Binding"; } } } </code>
Класс MyData:
<code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; namespace WpfApplication1 { public class MyData { private string myDataProperty; public MyData() { } public MyData(DateTime dateTime) { myDataProperty = "Last bound time was " + dateTime.ToLongTimeString(); } public MyData(string teste) { myDataProperty = teste; } public String MyDataProperty { get { return myDataProperty; } set { myDataProperty = value; OnPropertyChanged("MyDataProperty"); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string info) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(info)); } } } } </code>