Question

Le .NET Framework contient depuis la version 3.0 ObservableCollection , mais pourquoi il a ObservableKeyedCollection isnt .

D'accord, je pourrais mettre en œuvre ma propre collection en dérivant de KeyedCollection et la mise en œuvre INotifyCollectionChanged interface, mais whouldn't ce soit un bon ajout à .NET Framework.

Était-ce utile?

La solution

La raison pour laquelle il n'y a pas ObservableKeyedCollection (ou toute autre type qui est simplement une combinaison d'autres types génériques) est parce que ObservableCollection est générique, et qui fait la mise en œuvre d'un "ObservableKeyedCollection" aussi facile que ceci:

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

Bien que cela soit certainement pas un programme d'une doublure, la majeure partie est passe-partout. Plus important encore, il ne réimplémenter pas le ObservableCollection que vous suggériez; à la place, il utilise pleinement.

La raison pour laquelle il « whouldn't être un bon ajout au .NET Framework » est parce que quand il y a déjà une façon de faire quelque chose, ce qui crée une autre façon de le faire est une mauvaise idée. Les moins de moyens, il y a pour obtenir une tâche particulière fait, moins il y a de façons de le faire mal. 8)

Les outils sont fournis, il est maintenant tout sur la façon de les utiliser.

L'espoir qui aide!

Autres conseils

S'il vous plaît jeter un oeil à la page ObservableKeyedCollection classe mise en œuvre . Il est assez facile.

Je vous recommande de jeter un oeil à C5 . Il est une bibliothèque de collection générique merveilleux qui propose des collections observables en standard pour toutes ses collections, y compris Added, Inserted, Removed, RemovedAt, Cleared et Changed. De plus, les collections C5 tous épousent la « programmation à l'interface » idéale. Toutes les interfaces fournit exposer les fonctionnalités des implémentations qui sous-jacentes fait défaut dans l'espace de noms System.Collections.Generic. De plus, il est complet . Je vous encourage vivement à le vérifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top