Dlaczego warto używać INotifyPropertyChanged z powiązaniami w WPF?
Zauważyłem, że praktycznie każdy przykład znajdujący się w Internecie na temat powiązań ma klasę (która wiąże się z inną właściwością) dziedziczącą interfejs INotifyPropertyChanged i używa metody w ustawionej części właściwości klasy.
Próbowałem usunąć tę część z przykładu wiązania i działała tak samo, jak w przypadku metody.
Oto przykład. Zmieniłem go, więc byłby to tryb wiązania TwoWay i pokazał zmienioną właściwość w skrzynce wiadomości.
Zrobiłem to tylko po to, by grać trochę z powiązaniami, ale teraz naprawdę nie wiem, dlaczego ten interfejs jest używany
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>
Klasa 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>