Perché non c'è ObservableKeyedCollection in .NET Framework?
-
24-09-2019 - |
Domanda
Il .NET Framework contiene a partire dalla versione 3.0 del ObservableCollection
Va bene ho potuto realizzare la mia collezione derivando da KeyedCollection
Soluzione
Il motivo per cui non c'è ObservableKeyedCollection (o qualsiasi altro tipo tale che è semplicemente una combinazione di altri tipi generici) è perché ObservableCollection è generico, e che rende l'attuazione di un "ObservableKeyedCollection" facile come questo:
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 );
}
}
Anche se questo non è certamente un programma one-liner, la maggior parte di esso è boilerplate. Ancora più importante, non re-implementare il ObservableCollection come si erano suggerendo; invece utilizza pienamente.
La ragione per cui "whouldn't essere una buona aggiunta al .NET Framework" è perché quando c'è già un modo per fare qualcosa, creando un altro modo per farlo è una cattiva idea. I modi meno ci sono per ottenere qualche particolare compito fatto, le vie meno ci sono per farlo male. 8)
Gli strumenti sono forniti, ora è tutto su come si utilizzano.
Speranza che aiuta!
Altri suggerimenti
Si prega di prendere uno sguardo al ObservableKeyedCollection implementazione della classe . È abbastanza facile.
vi consiglio di dare un'occhiata a C5 . Si tratta di una meravigliosa libreria di raccolta generica che propone collezioni osservabili come standard per tutte le sue collezioni, tra cui Added
, Inserted
, Removed
, RemovedAt
, Cleared
e Changed
. Inoltre, le collezioni C5 tutto sposano la "programmazione per interfacciarsi" ideale. Tutte le interfacce fornisce esporre la piena funzionalità delle implementazioni-che sottostanti che manca nello spazio System.Collections.Generic
. Inoltre, v'è approfondita . Altamente vi incoraggio a check it out.