实现INotifyPropertyChanged有什么用?

时间:2017-02-03 11:11:46

标签: c# wpf mvvm inotifypropertychanged

当下面的代码在没有它的情况下正常工作时,实现INotifyPropertyChanged的用途是什么?

<DataGrid ItemsSource="{Binding Items}" 
          AutoGenerateColumns="False">
    <DataGrid.Columns>

        <DataGridTextColumn Header="Name" 
                            Binding="{Binding Name}"/>

        <DataGridComboBoxColumn Header="Color" 
                                SelectedItemBinding="{Binding Color}">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Colors}"/>
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Colors}"/>
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>

<Button Content="Change Colors" Click="Change"/>

   public class Data
   {
      private ObservableCollection<Item> _items;
      public ObservableCollection<Item> Items
      {
         get { return _items; }

      }

      public Data()
      {
         _items = new ObservableCollection<Item>();
         _items.Add(new Item() { Name = "A" });
         _items.Add(new Item() { Name = "B" });
      }

      public void Change()
      {
         _items[0].Colors.RemoveAt(1);
      }
   }

   public class Item
   {
      public string Name { get; set; }
      public string Color { get; set; }


      private IList<string> _colors;
      public IList<string> Colors
      {
         get { return _colors; }
      }


      public Item()
      {
         _colors = new List<string> { "Green", "Blue" };
         Color = _colors[0];
      }
   }

1 个答案:

答案 0 :(得分:4)

ObservableCollection<T>实现了INotifyCollectionChangedINotifyPropertyChanged接口,因此如果您只是希望能够在运行时添加和删除源集合中的项目,则无需实现INotifyPropertyChanged界面。

如果您希望能够动态更新ItemName属性,则必须在自定义Color类中实现它。

如果将Name的{​​{1}}属性设置为新值,除非Item类实现Item接口,否则不会反映在视图中在Name属性的setter中引发INotifyPropertyChanged事件。

  

如果我希望在集合发生变化时拥有自定义功能,该怎么办?例如抛出一条消息!我应该使用List而不是ObservableCollection并将该消息抛出属性的''set'吗?

您可以处理PropertyChanged的{​​{1}}事件。