8

.NET 框架从 3.0 版开始包含ObservableCollection<T>,但为什么没有 ObservableKeyedCollection<TKey, TValue>。

好的,我可以通过从KeyedCollection<TKey,TValue>派生并实现INotifyCollectionChanged接口来实现我自己的集合,但它不是 .NET 框架的一个很好的补充。

4

3 回答 3

2

没有 ObservableKeyedCollection(或任何其他此类类型,它只是其他泛型类型的组合)的原因是因为ObservableCollection是泛型的,这使得“ObservableKeyedCollection”的实现变得如此简单:

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

虽然这肯定不是一个单行程序,但其中大部分是样板文件。最重要的是,它不会像您建议的那样重新实现ObservableCollection ;相反,它充分利用了它。

它“不能成为 .NET Framework 的一个很好的补充”的原因是,当已经有一种方法可以做某事时,创建另一种方法来做这件事是个坏主意。完成某些特定任务的方法越少,做得不好的方法就越少。8)

提供了工具,现在就是关于如何使用它们的全部内容。

希望有帮助!

于 2010-03-04T17:11:02.357 回答
2

请看一下ObservableKeyedCollection 类的实现。这很容易。

于 2011-08-04T10:59:02.533 回答
1

我建议你看看C5。它是一个出色的通用集合库,提供可观察集合作为其所有集合的标准,包括AddedInsertedRemovedRemovedAtClearedChanged. 此外,C5 集合都支持“编程到接口”的理想。所有接口都提供了底层实现的全部功能——System.Collections.Generic命名空间中缺少这些功能。此外,还有详尽的文档。我强烈建议您检查一下。

于 2010-08-27T14:59:43.253 回答