2017-02-03 3 views
-3

Was nützt die Implementierung der INotifyPropertyChanged, wenn der untenstehende Code ohne es gut funktioniert?Was nutzt die Implementierung von 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

Um zu benachrichtigen, wenn sich eine Eigenschaft ändert. Für statische Daten ist es in der Tat nutzlos. FYI, ObservableCollection implementiert bereits INotifyPropertyChanged, so dass es sofort funktioniert, wenn sich seine Daten ändern. – Kilazur

+0

Jetzt versuchen Sie, Ihre Daten zu ändern, nachdem es geladen ist, und sehen, ob die Benutzeroberfläche zeigt, dass die Änderung – Pikoh

+2

'ObservableCollection' implementiert' INotifyPropertyChanged' [MSDN] (https://msdn.microsoft.com/en-us/library/ms668604 (v = vs.100) .aspx) – Equalsk

Antwort

4

Ein ObservableCollection<T> implementiert die INotifyCollectionChanged und INotifyPropertyChanged Schnittstellen so, wenn Sie einfach in der Lage sein wollen, zur Laufzeit Elemente aus der Quelle Sammlung hinzuzufügen und zu entfernen gibt es keine Notwendigkeit für Sie ist es, die INotifyPropertyChanged Schnittstelle zu implementieren.

Sie müssten es in Ihrer benutzerdefinierten Item Klasse implementieren, wenn Sie zum Beispiel die Name oder Eigenschaft dynamisch aktualisieren möchten.

Wenn Sie die Name Eigenschaft eines Item auf einen neuen Wert gesetzt wird dies nicht in der Ansicht reflektiert erhalten, es sei denn die Item Klasse implementiert die INotifyPropertyChanged-Schnittstelle und löst das PropertyChanged Ereignis in der Setter der Name-Eigenschaft.

Was ist, wenn ich eine benutzerdefinierte Funktionalität haben möchte, wenn sich die Sammlung ändert? Schreibe zum Beispiel eine Nachricht! Sollte ich List anstelle von ObservableCollection verwenden und diese Nachricht in das "Set" der Eigenschaft schreiben?

Das könnten Sie die CollectionChanged Ereignis des ObservableCollection<T> behandeln.

+0

Vielen Dank! – Vahid