2010-03-03 3 views

Antwort

2

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!

+9

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 ... –

+3

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

1

Ich würde Ihnen empfehlen, einen Blick auf C5 zu werfen. Es ist eine wunderbare generische Sammlung Bibliothek, die beobachtbare Sammlungen als Standard für alle seine Sammlungen bietet, einschließlich Added, Inserted, Removed, RemovedAt, Cleared und Changed. Darüber hinaus sind die C5-Kollektionen ideal für das "Programming to Interface". Alle Schnittstellen bieten die volle Funktionalität der zugrunde liegenden Implementierungen —, die im System.Collections.Generic Namespace fehlt. Darüber hinaus gibt es eine gründliche documentation. Ich ermutige Sie sehr, es zu überprüfen.

Verwandte Themen