2010-05-18 19 views
5

Ich möchte ein Wörterbuch haben, das 'Observable' ist, um Ereignisse auszulösen, wenn sich das Element ändert (Entfernen oder Hinzufügen).Beobachtbares Wörterbuch verhält sich nicht wie erwartet

In anderen Klassen habe ich ein solches Wörterbuch erstellt und binde auf ListBox.ItemsSourseProperty.
Die Bindung funktioniert gut. Ich kann die Gegenstände sehen.

Aber etwas stimmt nicht: das Ereignis PropertyChanged immer Null.

Kann jemand helfen?

Vielen Dank im Voraus!

class ObservableDictionary<TKey, TValue> : 
    Dictionary<TKey, TValue>, 
    INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public new void Remove(TKey obj) 
    { 
     base.Remove(obj); 

     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Remove")); 
     } 
    } 
} 
+1

ähnliche Frage: http://stackoverflow.com/questions/1098663/general-observable-dictionary-class-for-datathinding-wpf-c –

+4

Seien Sie vorsichtig, wenn Sie das neue Schlüsselwort verwenden ... weil diese Methode nur sein wird Wird aufgerufen, wenn das Objekt auf ObservableDictionary beschränkt ist. Da der Großteil des Framework-Bindind-Modells es in IEnumerable umwandelt, ruft Add & Remove weiterhin die Downstream-Implementierung im Basiswörterbuch auf. Ich würde stattdessen Ihre Klasse als eine Wrapper-Klasse schreiben, die ein internes Dictionary für Speicher hat und dann die IDictionary & INotifyCollectionChanged-Schnittstellen und entsprechende Methoden implementieren. –

+0

öffentliche Klasse Foo { public void Balken() { Console.WriteLine ("Test 1"); } } public class foo2: Foo { public neue Leere Bar() { Console.WriteLine ("Test 2"); } } var f = neu Foo2(); f.Bar(); ((Foo) f) .Bar(); Rückgabe Test 2 Test 1 –

Antwort

5

Sie sollten PropertyChanged nicht für ein Sammlungsänderungsereignis aufrufen. Sie müssen INotifyCollectionChanged implementieren.

2

Wer abonniert Propertychange?

Für eine beobachtbare Sammlung Sie auch

INotifyCollectionChanged wollen gehen zu
3

Haben Sie den PropertyChanged Ereignis zu abonnieren?

var dictionary = new ObservableDictionary<int, int>(); 
dictionary.PropertyChanged += 
    (sender, args) => MessageBox.Show(args.PropertyName); 
dictionary.Add(1, 2); 
dictionary.Remove(1); 

Dies funktioniert für mich.

Aber es wäre sauberer, die Schnittstelle IDictionary anstelle der new Schlüsselwort zu implementieren. Dann können Sie eine private Dictionary Instanz in Ihrer Klasse verwenden, um Ihnen die Arbeit zu sichern, alles auf eigene Faust zu implementieren.

+0

Funktioniert für mich auch ... BTW sollten Sie überprüfen, dass base.Remove (obj) tatsächlich etwas entfernt :) – Rusty

+0

Ich verbinde die ElementeSource of Control. Ist die Bindung nicht automatisch an PropertyChanged gebunden? – yossharel

+1

@yossharel, nein, für ItemsSource wird INotifyCollectionChanged abonniert –

2

Es klingt wie Sie für eine Wörterbuch Version von ObservableCollection (siehe: MSDN) suchen können, die sowohl INotifyCollectionChanged und INotifyPropertyChanged aus der Box implementiert. Vielleicht kann es hilfreich sein, über die Implementierung im Reflektor zu schauen? Es befindet sich in dem System.Collections.ObjectModel-Namespace in der System.dll-Assembly.

Verwandte Themen