2016-04-21 3 views
0

Ich denke, das ein dummes Problem ist, aber ...Eigentum von ObservableCollectio geändert <T> zur Klasse

ich eine Window-Klasse mit einer Treeview Bindung an einen Observablecollection<T> foo; T habe, ist meine Klasse (in einer anderen Datei CS-). Meine Observablecollection foo haben OnPropertyChanged für hinzufügen/löschen Element und funktioniert ok. Das Problem ist für meine Klasse T: es hat 5 Eigenschaften und eine haben OnPropertyChanged: wenn ich programmgesteuert ein Element meiner Klasse TI haben OnPropertyChanged in class T (natürlich), aber ... wie kann ich es aus Window Klasse für etwas tun ?

+0

Warum möchten Sie das tun? Möchten Sie auf Eigenschaftenänderungen in allen Klassen in der Window-Klasse reagieren? –

+0

@EmpererAiman ​​Ich muss dies tun, denn wenn ich die Eigenschaft in 'Klasse T' ändere, muss ich Element zu einer anderen Liste hinzufügen ... – Al3xI98O

Antwort

0

Sie möchten Propertychange-Ereignisse für die Objekte in der beobachtbaren Sammlung hören?

Dafür habe ich eine Erweiterung von ObsercableCollection erstellt, die diese Ereignisse auf eine Auflistungsebene aufbläht, sodass ich collection.CollectionChanged (Hinzufügen und Entfernen von Elementen) und collection.ItemInCollectionChange (Eigenschaft eines Elements in der Auflistung) abonnieren kann hat sich geändert):

//public class ItemInCollectionChangeEventArgs 
public class ItemInCollectionChangeEventArgs : EventArgs 
{ 
    public object Item { get; internal set; } 
    public PropertyChangedEventArgs PropertyChangedEventArgs { get; internal set; } 
} 

public delegate void ItemInCollectionChangeEventHandler(Object sender, ItemInCollectionChangeEventArgs e); 

//TODO Make this throw a separate event for refreshing 
public class ItemsChangeObservableCollection<T> : 
     ObservableCollection<T> where T : INotifyPropertyChanged 
{ 
    public event ItemInCollectionChangeEventHandler ItemInCollectionChangeEvent; 

    public ItemsChangeObservableCollection() : base() 
    { 
    } 

    public ItemsChangeObservableCollection(IEnumerable<T> collection) : base() 
    { 
     foreach (T item in collection) 
     { 
      Add(item); 
     } 
    } 

    protected virtual void OnItemInCollectionChange(ItemInCollectionChangeEventArgs e) 
    { 
     ItemInCollectionChangeEventHandler handler = ItemInCollectionChangeEvent; 
     if (handler != null) 
     { 
      handler(this, e); 
     } 
    } 

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      RegisterPropertyChanged(e.NewItems); 
     } 
     else if (e.Action == NotifyCollectionChangedAction.Remove) 
     { 
      UnRegisterPropertyChanged(e.OldItems); 
     } 
     else if (e.Action == NotifyCollectionChangedAction.Replace) 
     { 
      UnRegisterPropertyChanged(e.OldItems); 
      RegisterPropertyChanged(e.NewItems); 
     } 

     base.OnCollectionChanged(e); 
    } 

    protected override void ClearItems() 
    { 
     UnRegisterPropertyChanged(this); 
     base.ClearItems(); 
    } 

    private void RegisterPropertyChanged(IList items) 
    { 
     foreach (INotifyPropertyChanged item in items) 
     { 
      if (item != null) 
      { 
       item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); 
      } 
     } 
    } 

    private void UnRegisterPropertyChanged(IList items) 
    { 
     foreach (INotifyPropertyChanged item in items) 
     { 
      if (item != null) 
      { 
       item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged); 
      } 
     } 
    } 

    private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     OnItemInCollectionChange(new ItemInCollectionChangeEventArgs { Item = sender, PropertyChangedEventArgs = e }); 
     //base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
    } 
} 
+0

Ja, @Joe Ich möchte in der Lage sein, Propertychange-Ereignisse auf den Objekten innerhalb der Observablen zu hören Sammlung! Schöne Erweiterung: jetzt probiere ich es aus! – Al3xI98O

+0

Sorry @Joe, was ist das 'KPIRealTimeViewModel'? – Al3xI98O

+0

Das ist ein ViewModel, das ich in meinem Projekt verwende. Es sollte nicht dort sein, und, beim Betrachten des Codes, ich denke, es wurde automatisch hinzugefügt, wenn ich VS den Konstruktor erstellen ließ: public ItemsChangeObservableCollection (IEnumerable Sammlung) wie es Felder des Konstruktorarguments manchmal automatisch erstellt (der generierte Konstruktor war dann bearbeitet, um es allgemeiner zu machen), löschen Sie es einfach (ich werde es aus der Antwort entfernen). – Joe