2010-03-03 20 views

Odpowiedz

2

Powodem, dla którego nie ma ObservableKeyedCollection (lub inny taki typ, który jest jedynie kombinacją innych typów generycznych) dlatego ObservableCollection jest nazwą rodzajową, i sprawia, że ​​wdrożenie „ObservableKeyedCollection” tak łatwe, jak to:

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); 
    } 
} 

Chociaż z pewnością nie jest to program jednolinijkowy, większość z nich to zestaw podstawowy. Co najważniejsze, nie jest to ponowne wdrożenie ObservableCollection zgodnie z sugestią; zamiast tego w pełni go wykorzystuje.

Powodem, że "nie może być dobrym dodatkiem do platformy .NET Framework" jest fakt, że gdy istnieje już jeden sposób, aby coś zrobić, stworzenie innego sposobu na zrobienie tego jest złym pomysłem. Im mniej sposobów, aby wykonać określone zadanie, tym mniej jest sposobów, aby zrobić to źle. 8)

Narzędzia są dostępne, teraz wszystko zależy od sposobu ich użycia.

Nadzieję, że pomaga!

+9

W KeyedCollection jest wiele rzeczy, których nie ma w twoim rozwiązaniu. Na przykład indeksator oparty na kluczu, zapobiega dodawaniu elementów z tym samym kluczem, itd. Tak więc powyższy kod może być szablonem, ale z pewnością nie jest kompletny. Framework jest dla dostarczania nam narzędzi, które są nie tylko przydatne w użyciu, ale także kompletne w ich realizacji ... –

+3

Zgadzam się z Jeroen. Ta odpowiedź nie ma podstawowych możliwości KeyedCollection. Chciałbym również zwrócić uwagę, że gdyby struktura ObservableKeyedCollection została dostarczona przez framework, mielibyśmy najmniej możliwych sposobów, aby to zrobić - 1 - zamiast tworzenia wszystkich własnych rozwiązań, z których wiele zostanie zerwanych, jak ten. – totorocat

1

Polecam spojrzeć na C5. Jest to wspaniała kolekcja generic biblioteka, która oferuje do zaobserwowania kolekcje jako standard dla wszystkich swoich zbiorów, w tym Added, Inserted, Removed, RemovedAt, Cleared i Changed. Dodatkowo wszystkie kolekcje C5 są idealne do "programowania do interfejsu". Wszystkie interfejsy zapewniają pełną funkcjonalność podstawowych implementacji —, której brakuje w przestrzeni nazw . Dodatkowo jest dokładny documentation. Gorąco zachęcam do sprawdzenia tego.