Frage

Das .NET Framework enthält seit Version 3.0 der ObservableCollection , aber warum isn't ein ObservableKeyedCollection .

Okay, ich kann meine eigene Sammlung implementieren durch Ableiten von KeyedCollection und die INotifyCollectionChanged Schnittstelle, aber whouldn't es eine gute Ergänzung zu dem .NET Framework sein.

War es hilfreich?

Lösung

Der Grund, dass es keine ObservableKeyedCollection (oder irgendeine andere solche Art, die lediglich eine Kombination von anderen generischen Typen) ist, weil ObservableCollection ist generisch, und das macht die Umsetzung eines "ObservableKeyedCollection" so einfach wie folgt aus:

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

Während das sicherlich kein Programm Einzeiler ist, ist das meiste davon vorformulierten. Am wichtigsten ist, ist es nicht neu implementieren die ObservableCollection , wie Sie waren darauf hindeutet; stattdessen voll es nutzt es.

Der Grund, dass es „whouldn't eine gute Ergänzung zu dem .NET Framework seiner“ ist, weil, wenn es bereits eine Möglichkeit, etwas zu tun, eine andere Art und Weise zu schaffen macht es eine schlechte Idee ist. Je weniger Möglichkeiten gibt es einige bestimmte Aufgabe zu erledigen, desto weniger Möglichkeiten gibt es es schlecht zu tun. 8)

Die Werkzeuge werden zur Verfügung gestellt, es ist jetzt alles darüber, wie man sie benutzt.

Ich hoffe, das hilft!

Andere Tipps

Bitte nehmen Sie sich einen Blick auf die ObservableKeyedCollection Klassenimplementierung . Es ist ziemlich einfach.

Ich würde empfehlen Ihnen einen Blick auf C5 . Es ist eine wunderbare Sammlung generische Bibliothek, dass Angebote beobachtbaren Sammlungen als Standard für alle seine Sammlungen, darunter Added, Inserted, Removed, RemovedAt, Cleared und Changed. Zusätzlich vermählen die C5 Sammlungen alle „Programmierung Schnittstelle“ ideal. Sämtliche Schnittstellen, bietet die volle Funktionalität der zugrunde liegenden Implementierungen-die belichten im System.Collections.Generic Namespace fehlt. Darüber hinaus gibt es gründlich Dokumentation . Ich sehr empfehlen Ihnen, es zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top