.NET Framework从版本3.0开始包含ObservableCollection<T>,但为什么没有ObservableKeyedCollection&lt; TKey,TValue&gt ;.
好吧,我可以通过从KeyedCollection<TKey,TValue>派生并实现INotifyCollectionChanged接口来实现我自己的集合,但它不是.NET Framework的一个很好的补充。
答案 0 :(得分: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)
提供了工具,现在就是如何使用它们了。
希望有所帮助!
答案 1 :(得分:2)
答案 2 :(得分:1)
我建议你看一下C5。它是一个很棒的通用集合库,它为所有集合提供了可观察的集合,包括Added
,Inserted
,Removed
,RemovedAt
,Cleared
,和Changed
。此外,C5系列都支持“编程到接口”的理想选择。所有接口都提供了底层实现的全部功能 - 这是System.Collections.Generic
命名空间中缺少的。此外,还有彻底的documentation。我强烈建议您查看。