Реализовать наблюдаемый словарь сложно.Намного проще поддерживать параллельную наблюдаемую коллекцию, содержащую значения словаря.Привязать представление к этой коллекции и убедиться, что любой код, который добавляет или удаляет значения в / из словаря, обновляет как словарь, так и параллельную коллекцию.
Если вы действительно хотите сходить с ума, вы можете реализоватьподкласс ObservableCollection
для хранения ваших объектов и обеспечения того, чтобы этот класс поддерживал словарь, например:
public class KeyedObject
{
public string Key { get; set; }
public object Value { get; set; }
}
public class ObservableMappedCollection : ObservableCollection<KeyedObject>
{
private Dictionary<string, KeyedObject> _Map;
public ObservableMappedCollection(Dictionary<string, KeyedObject> map)
{
_Map = map;
}
protected override void InsertItem(int index, KeyedObject item)
{
base.InsertItem(index, item);
_Map[item.Key] = item;
}
protected override void RemoveItem(int index)
{
KeyedObject item = base[index];
base.RemoveItem(index);
_Map.Remove(item.Key);
}
protected override void ClearItems()
{
base.ClearItems();
_Map.Clear();
}
protected override void SetItem(int index, KeyedObject item)
{
KeyedObject oldItem = base[index];
_Map.Remove(oldItem.Key);
base.SetItem(index, item);
_Map[item.Key] = item;
}
}
Существует множество потенциальных проблем, описанных выше, в основном связанных с дублирующимися значениями ключей.Например, что должен сделать SetItem
, если вы добавляете объект, ключ которого уже есть на карте?Ответ действительно зависит от вашего приложения.Подобные проблемы также намекают на то, почему в структуре нет наблюдаемого словарного класса.