Pregunta

El .NET Framework contiene desde la versión 3.0 del ObservableCollection , pero ¿por qué nO ES existe una ObservableKeyedCollection .

i bien podría poner en práctica mi propia colección por derivados de KeyedCollection y la aplicación de la INotifyCollectionChanged interfaz, pero whouldn't sea una buena adición a la .NET Framework.

¿Fue útil?

Solución

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érico, y eso 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 );
    }
}

Mientras que ciertamente no es un programa de una sola línea, la mayor parte es repetitivo. Lo más importante es que no se vuelva a poner en práctica el ObservableCollection como usted sugerían; En su lugar, utiliza plenamente.

La razón de que "whouldn't será una buena adición a .NET Framework" es porque cuando ya hay una manera de hacer algo, crear otra forma de hacerlo es una mala idea. El menor número de maneras que hay para conseguir algo de tarea en particular hecho, el menor número de maneras hay que hacerlo mal. 8)

Se proporcionan las herramientas, ahora es todo acerca de cómo se usan.

Espero que ayude!

Otros consejos

Por favor, eche un vistazo a la ObservableKeyedCollection implementación de la clase . Es bastante fácil.

Yo recomiendo que eche un vistazo a C5 . Es una biblioteca maravillosa colección genérica que ofrece colecciones observables como estándar para todas sus colecciones, incluyendo Added, Inserted, Removed, RemovedAt, Cleared y Changed. Además, las colecciones C5 todos defienden la "programación de interfaz" ideal. Todas las interfaces proporciona exponer la funcionalidad completa de las implementaciones subyacentes -que no existe en el espacio de nombres System.Collections.Generic. Además, hay . Yo le animo a comprobarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top