Реализация наблюдаемого словаря сложна. Гораздо проще поддерживать параллельную наблюдаемую коллекцию, содержащую значения словаря. Привяжите представление к этой коллекции и убедитесь, что любой код, который добавляет или удаляет значения в/из словаря, обновляет как словарь, так и параллельную коллекцию.
Если вы действительно хотите, чтобы сойти с ума, вы могли бы реализовать подкласс 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
, если вы добавляете объект, чей ключ уже находится на карте? Ответ действительно зависит от вашего приложения. Подобные проблемы также указывают на то, что в структуре нет наблюдаемого словарного класса.
Это было довольно простое и полезное решение. Спасибо большое =) – cemregoksu
и еще один вопрос: Что делать, если я хочу использовать словарь вместо списка? как я могу справиться с этим? – cemregoksu
Я только что нашел keyedcollection и теперь попробовал его. Надеюсь, он работает =) t –
cemregoksu