65.9K
CodeProject 正在变化。 阅读更多。
Home

实现INotifyPropertyChanged

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (14投票s)

2009 年 8 月 28 日

CPOL

1分钟阅读

viewsIcon

117452

downloadIcon

2

本文档展示了如何实现 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>()));
  • 我还添加了一个 DependencyPropertyFirstName,在 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 中,添加一个 DataGridTextBox,并将它们分别绑定到 ObservableCollectionDependencyProperty
    <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 下载示例应用程序。
© . All rights reserved.