La raison pour laquelle il n'y a pas ObservableKeyedCollection (ou toute autre type qui est simplement une combinaison d'autres types génériques) est parce que ObservableCollection est générique, et qui fait la mise en œuvre d'un « ObservableKeyedCollection » aussi facile que cela:
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);
}
}
Bien que ce ne soit certainement pas un programme à une seule ligne, la plupart d'entre elles sont de type standard. Plus important encore, il ne ré-implémente pas le ObservableCollection comme vous le suggériez; Au contraire, il l'utilise pleinement. La raison pour laquelle "cela ne devrait pas être un bon ajout au .NET Framework" est parce que quand il y a déjà une façon de faire quelque chose, créer une autre façon de le faire est une mauvaise idée. Moins il y a de façons d'accomplir une tâche particulière, moins il y a de façons de le faire mal. 8)
Les outils sont fournis, c'est maintenant tout sur la façon dont vous les utilisez.
Espérons que ça aide!
Il y a beaucoup de choses disponibles dans le KeyedCollection qui ne sont pas dans votre solution. Par exemple, un indexeur basé sur la clé, empêche d'ajouter des éléments avec la même clé, etc. Donc le code ci-dessus peut être très répandu, mais il n'est certainement pas complet. Le Framework est pour nous donner des outils qui ne sont pas seulement pratiques à utiliser, mais aussi complets dans leur implémentation ... –
Je suis d'accord avec Jeroen. Cette réponse n'a pas les capacités fondamentales de KeyedCollection. Je tiens également à souligner que si ObservableKeyedCollection était fourni par le framework, alors nous aurions le moins de moyens possibles de le faire - 1 - plutôt que de créer chacun sa propre solution, dont beaucoup seront brisées comme celle-ci. – totorocat