Der Grund, dass es keine ObservableKeyedCollection ist (oder irgendeine andere solche Art, die lediglich eine Kombination von anderen generischen Typen ist), weil ObservableCollection generisch ist, und das macht die Umsetzung eines „ObservableKeyedCollection“ so einfach wie diese:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
public class DictionaryWatcher : ObservableCollection<KeyValuePair<string, object>>, IDisposable
{
private NotifyCollectionChangedEventHandler watcher;
private bool watching = false;
public DictionaryWatcher()
{
watcher = new NotifyCollectionChangedEventHandler(ReportChange);
CollectionChanged += watcher;
Watched = true;
}
public bool Watched
{
get
{
return watching;
}
set
{
if (watching)
{
lock (this)
{
CollectionChanged -= watcher;
watching = false;
}
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Initialize()
{
this.Add(new KeyValuePair<string, object>("First", 1));
this.Add(new KeyValuePair<string, object>("Second", 2));
this.Add(new KeyValuePair<string, object>("Turd", 3));
KeyValuePair<string, object> badValue = this[2];
this.Remove(badValue);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && Watched)
{
Watched = false;
}
}
private void ReportChange(object sender, NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("Change made: {0}", e.Action);
}
}
Während das ist sicherlich kein Ein-Liner-Programm, ist das meiste davon Boilerplate. Am wichtigsten ist, dass es die ObservableCollection, wie Sie vorgeschlagen haben, nicht erneut implementiert; stattdessen nutzt es es voll aus.
Der Grund, dass es "keine gute Ergänzung zu dem .NET Framework" ist, ist, weil, wenn es schon einen Weg gibt, etwas zu tun, eine andere Möglichkeit, es zu tun, eine schlechte Idee ist. Je weniger Wege es gibt, um eine bestimmte Aufgabe zu erledigen, desto weniger Möglichkeiten gibt es, es schlecht zu machen. 8)
Die Tools werden zur Verfügung gestellt, jetzt geht es darum, wie Sie sie verwenden.
Hoffe, dass hilft!
In der KeyedCollection sind viele Dinge verfügbar, die nicht in Ihrer Lösung enthalten sind. Ein Indexer, der auf dem Schlüssel basiert, verhindert z. B. das Hinzufügen von Elementen mit dem gleichen Schlüssel usw. Der obige Code könnte also ein Vorsatz sein, aber er ist sicherlich nicht vollständig. Das Framework dient dazu, uns Tools zur Verfügung zu stellen, die nicht nur praktisch sind, sondern auch in ihrer Implementierung vollständig sind ... –
Ich stimme Jeroen zu. Diese Antwort verfügt nicht über die grundlegenden Funktionen der KeyedCollection. Ich möchte auch darauf hinweisen, dass wir, wenn ObservableKeyedCollection vom Framework bereitgestellt würde, die wenigsten Möglichkeiten haben würden, dies zu tun - anstatt dass jeder seine eigene Lösung erstellt, von denen viele wie dieser gebrochen werden. – totorocat