Vra

Die NET Framework bevat sedert weergawe 3.0 die ObservableCollection , maar waarom isnt daar 'n ObservableKeyedCollection .

Goed ek kon my eie versameling te implementeer deur vloei uit KeyedCollection en implementering van die INotifyCollectionChanged koppelvlak, maar whouldn't dit 'n goeie toevoeging tot die NET Framework.

Was dit nuttig?

Oplossing

Die rede dat daar geen ObservableKeyedCollection (of enige ander so 'n tipe wat is bloot 'n kombinasie van ander generiese tipes) is omdat ObservableCollection is generiese, en dit maak die implementering van 'n" ObservableKeyedCollection "so maklik soos dit:

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

Terwyl dit is beslis nie 'n one-liner program, die meeste van dit is boiler. Die belangrikste is dat dit nie weer te implementeer die ObservableCollection as jy was daarop dui; plaas dit ten volle benut nie.

Die rede dat dit "whouldn't 'n goeie toevoeging tot die NET Framework wees" is omdat wanneer daar reeds 'n manier om iets te doen, skep 'n ander manier om dit te doen is 'n slegte idee. Die minder maniere daar is om ontslae sommige besondere taak gedoen, hoe minder maniere daar is om dit sleg te doen. 8)

Die gereedskap word, dit is nou alles oor hoe jy dit gebruik.

Hoop dit help!

Ander wenke

Neem asseblief 'n blik op die ObservableKeyedCollection klas implementering . Dit is redelik maklik.

Ek sou aanbeveel jy kyk na C5 neem . Dit is 'n wonderlike generiese versameling biblioteek wat bied waarneembaar versamelings as standaard vir al sy versamelings, insluitend Added, Inserted, Removed, RemovedAt, Cleared, en Changed. Daarbenewens het die C5 versamelings al die "ontwikkeling te koppel" ideale voorstaan. Al die koppelvlakke bied bloot die volle funksionaliteit van die onderliggende implementering-oorblyfsels in die System.Collections.Generic naamruimte. Daarbenewens is daar is deeglike dokumentasie . Ek hoogs moedig jou aan om dit te sien.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top