Причина, по которой отсутствует 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)
Инструменты предоставляются, теперь все зависит от того, как вы их используете.
Надеюсь, это поможет!