Domanda

Il .NET Framework contiene a partire dalla versione 3.0 del ObservableCollection , ma perché purtroppo non si c'è un ObservableKeyedCollection .

Va bene ho potuto realizzare la mia collezione derivando da KeyedCollection e l'attuazione della INotifyCollectionChanged interfaccia, ma whouldn't si tratti di una buona aggiunta al .NET Framework.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top