2016-04-25 20 views
0
public class PricingGrpModel 
{ 
    public string Name { get; set; } 
    public string Description { get; set; }  
} 

private ObservableCollection<PricingGrpModel> _myCollection;  
public ObservableCollection<PricingGrpModel> myCollection 
{ 
    get { return _myCollection; } 
    set { _myCollection= value; OnPropertyChanged("myCollection"); } 
} 

myCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(myCollection_CollectionChanged); 

void myCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    try 
    { 
     switch (e.Action) 
     {     
      case NotifyCollectionChangedAction.Add:      
       break; 

      case NotifyCollectionChangedAction.Remove: 
       break; 
     } 
    } 
    catch(Exception exception) 
    {    
    } 
} 

Ich habe 'myCollection' ObservableCollection an DataGrid ItemsSource gebunden. Das Ereignis Sammeländerung wurde ausgelöst, während die Zeile hinzugefügt oder entfernt wurde. Aber ich konnte die Änderungen des vorhandenen Zeilenwerts nicht verfolgen. Wie kann ich benachrichtigt werden, wenn die Eigenschaft eines Objekts in einer ObservableCollection geändert wurde?Wie Werte in ObservableCollection in WPF (MVVM) bearbeitet werden

+1

Sie möchten 'PricingGrpModel' implementieren' INotifyPropertyChanged'. https://msdn.microsoft.com/en-us/library/system.componentmodel.inotify-propertychangeed(v=vs.110).aspx –

+0

nur zur Klarstellung: ObservableCollection ist nicht bewusst, bestimmte Änderungen an den Elementen, kann ObservableCollection Sie informieren nur über die Änderungen an sich, z neue Gegenstände oder entfernte Gegenstände. Daher, wie Chris Wohlert kommentierte, müssen Sie INotifyPropertyChanged in PricingGrpModel implementieren, um mit Änderungen an einzelnen Objekten umgehen zu können. –

+0

Die "PricingGrpModel" -Klasse ist eine Entity-Klasse, sie ist aus EF generiert. Wie könnte ich 'INotifyPropertyChanged' implementieren? – Dinesh

Antwort

0

können Sie NewItems und OldItems Eigenschaften der NotifyCollectionChangedEventArgs verwenden.

Wenn Sie ObservableCollection.Remove() aufrufen, werden die entfernten Elemente in OldItems Eigenschaft vorhanden sein:

void myCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.OldItems != null) 
    { 
     foreach (var removedItem in e.OldItems) 
     { 
     } 
    } 
} 

Das einzige Problem ist, dass, wenn Sie ObservableCollection.Clear() Methode aufrufen, die OldItems Eigenschaft null ist.

Wenn Sie auch auf gelöschte Elemente zugreifen möchten, müssen Sie Ihre benutzerdefinierte Klasse erstellen, indem Sie von ObservableCollection erben und die geschützte Methode RemoveItem überschreiben. RemoveItem Methode wird auch aufgerufen, wenn Sie anrufen ObservableCollection.Clear() Sie meine ExtendedObservableCollection aus dieser Antwort verwenden kann: Trigger InotifyPropertyChanged/CollectionChanged on ObservableCollection

0

Sie können nicht direkt auf die Artikel Änderungen über das Collection Ereignis verfolgen. Sie können Folgendes tun: Hinzufügen und Entfernen eines EventHandler zu dem PricingGrpModel.PropertyChanged in dem CollectionChanged EventHandler für jedes Objekt in der ObservableCollection.

Verwandte Themen