实现INotifyPropertyChanged






4.80/5 (14投票s)
本文档展示了如何实现 INotifyPropertyChanged。
引言
如果一个对象实现了 INotifyPropertyChanged
接口,当其属性发生改变时,它将引发一个属性更改事件。让我们创建一个示例应用程序来了解如何实现 INotifyPropertyChanged
接口。我正在创建一个 Silverlight 应用程序,它演示了与同时实现 INotifyPropertyChanged
的对象和普通的 DependencyProperty
的数据绑定。
- 打开 Visual Studio 并选择一个新的 Silverlight 应用程序。
- 在 Silverlight 项目中创建一个名为
Customer
的类并实现INotifyPropertyChanged
。public class Customer : INotifyPropertyChanged {
- 定义
INotifyPropertyChanged
成员public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, e); } }
- 在属性设置器中,通过传递属性名称来调用
OnPropertyChanged
,例如private string _Name; public string Name { get { return _Name; } set { _Name = value; OnPropertyChanged(new PropertyChangedEventArgs("Name")); } }
- 在 MainPage.xaml.cs 中,添加一个
Customer
对象的ObservableCollection
作为依赖属性,以确保当我们将客户列表分配给另一个列表或对象时,UI 会更新。如果将其设为普通属性,则只有在向客户列表添加新对象或底层属性发生更改时,UI 才会更新。public ObservableCollection<Customer> CustomerList { get { return (ObservableCollection<Customer>) GetValue(CustomerListProperty); } set { SetValue(CustomerListProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty CustomerListProperty = DependencyProperty.Register("CustomerList", typeof(ObservableCollection<Customer>), typeof(MainPage), new PropertyMetadata(new ObservableCollection<Customer>()));
- 我还添加了一个
DependencyProperty
,FirstName
,在 MainPage.xaml.cs 中,只是为了展示简单DependencyProperty
的绑定。public string FirstName { get { return (string)GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty FirstNameProperty = DependencyProperty.Register("FirstName", typeof(string), typeof(MainPage), new PropertyMetadata(string.Empty));
- 在 MainPage.XAML 中,添加一个
DataGrid
和TextBox
,并将它们分别绑定到ObservableCollection
和DependencyProperty
。<data:DataGrid AutoGenerateColumns="True" Width="400" Height="300" ItemsSource="{Binding ElementName=TestUC, Path=CustomerList}"> </data:DataGrid> <TextBox x:Name="NameTextBox" Text="{Binding ElementName=TestUC, Path=FirstName, Mode=TwoWay}" Width="100" Height="25" Margin="0,10,0,10" />
- 为了理解
PropertyChanged
事件,我添加了一个按钮,并在Click
事件中更新了Customer
对象,以便您可以在DataGrid
中看到更改。当您从Click
事件更改Customer
对象的属性时,您会看到 UI 相应地更新。 - 从 Implementing INotifyPropertyChanged 下载示例应用程序。