2010-03-03 10 views

Respuesta

2

La razón de que no hay ObservableKeyedCollection (o cualquier otro tipo que no es más que una combinación de otros tipos genéricos) se debe a ObservableCollection es genérica, y que hace que la implementación de un "ObservableKeyedCollection" tan fácil como esto:

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

Si bien no es un programa de una sola línea, la mayoría es un estándar. Lo que es más importante, no vuelve a implementar el ObservableCollection como estaba sugiriendo; en cambio, lo utiliza completamente.

La razón por la que "no sería una buena adición al .NET Framework" es porque cuando ya hay una forma de hacer algo, crear una forma de hacerlo es una mala idea. Cuantas menos formas hay de realizar alguna tarea particular, menos maneras hay de hacerlo mal. 8)

Se proporcionan las herramientas, ahora se trata de cómo las usa.

Espero que ayude!

+9

Hay muchas cosas disponibles en KeyedCollection que no están en su solución. Por ejemplo, un indexador basado en la clave, evita agregar elementos con la misma clave, etc. Por lo tanto, el código anterior puede ser un texto repetitivo, pero ciertamente no está completo. El Marco es para darnos herramientas que no solo son útiles para usar, sino que también completan su implementación ... –

+3

Estoy de acuerdo con Jeroen. Esta respuesta no tiene las capacidades fundamentales de KeyedCollection. También quiero señalar que si el framework proporcionara ObservableKeyedCollection, entonces tendríamos la menor cantidad posible de maneras de hacerlo, 1 en lugar de que todos creen su propia solución, muchas de las cuales se romperán como esta. – totorocat

1

Yo recomendaría que eche un vistazo a C5. Es una maravillosa biblioteca genérica de colecciones que ofrece colecciones observables como estándar para todas sus colecciones, incluidas Added, Inserted, Removed, RemovedAt, Cleared y Changed. Además, todas las colecciones C5 propugnan el ideal de "programación para interfaz". Todas las interfaces proporcionan la funcionalidad completa de las implementaciones subyacentes — que faltan en el espacio de nombres System.Collections.Generic. Además, hay una completa documentation. Te animo a que lo revises.

Cuestiones relacionadas