2017-02-03 20 views
-3

Какая польза от реализации 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]; 
     } 
    } 
+2

Уведомлять, когда изменяется свойство. Для статических данных это действительно бесполезно. FYI, ObservableCollection уже реализует INotifyPropertyChanged, поэтому он работает вне поля, когда его данные изменяются. – Kilazur

+0

Теперь попробуйте изменить свои данные после его загрузки и посмотреть, показывает ли пользовательский интерфейс это изменение. – Pikoh

+2

'ObservableCollection' реализует' INotifyPropertyChanged' [MSDN] (https://msdn.microsoft.com/en-us/library/ms668604 (v = vs.100) .aspx) – Equalsk

ответ

4

ObservableCollection<T> реализует интерфейсы INotifyCollectionChanged и INotifyPropertyChanged, так что если вы просто хотите, чтобы иметь возможность добавлять и удалять элементы из исходной коллекции во время выполнения нет необходимости для вас реализовать интерфейс INotifyPropertyChanged.

Вам нужно было бы реализовать его в своем обычном классе Item, если бы захотели, например, обновить свойство Name или Color.

Если вы установите Name свойство в Item новое значение этого не получит отражение в представлении, если Item класса не реализует интерфейс INotifyPropertyChanged и поднимает PropertyChanged события в инкубаторе собственности Name.

Что делать, если я хочу иметь пользовательские функции при изменении коллекции! Например, бросьте сообщение! Должен ли я использовать List вместо ObservableCollection и выкинуть это сообщение в `set 'свойства?

Вы можете обработать событие CollectionChangedObservableCollection<T>.

+0

Большое вам спасибо! – Vahid