KeyValuePair
не реализует INotifyPropertyChanged
, поэтому я реализовал свой собственный тип Pair
, но я хочу использовать его в словаре.
Какой самый простой способ сделать это?
Итак, сделка.В моем коде мне нужен словарь с парами ключ / значение.Это на самом деле не должно быть наблюдаемым.
У меня есть окно редактирования, которое отображает этот диктат в сетке данных.Это должно быть заметно, чтобы сетка данных могла творить свою магию.
Итак, я сделал так, чтобы окно редактирования приняло любую перечисляемую пару:
public ObservableCollection<Pair<string,object>> Variables { get; private set; }
public VariablesWindow(IEnumerable<Pair<string, object>> vars)
{
Variables = new ObservableCollection<Pair<string, object>>(vars.DeepCopy());
может сделать свое дело.И затем в основном коде я использую dict как обычно, но когда я открываю окно редактирования, я должен преобразовать dict во что-то, что окно редактирования может использовать:
var window = new VariablesWindow(Dict2Enum(_dict));
Итак, я добавил эти 2вспомогательные методы:
private static IEnumerable<Pair<TKey, TValue>> Dict2Enum<TKey, TValue>(Dictionary<TKey, TValue> dict)
{
return dict.Select(i => new Pair<TKey, TValue>(i.Key, i.Value));
}
private static Dictionary<TKey, TValue> Enum2Dict<TKey, TValue>(IEnumerable<Pair<TKey, TValue>> collection)
{
return collection.ToDictionary(p => p.Key, p => p.Value);
}
Кажется, хотя и немного дороже.Я переворачиваю коллекцию дважды.Один раз преобразовать словарь в перечислимый, затем снова глубоко скопировать его, чтобы переменные не менялись до тех пор, пока пользователь не нажмет «сохранить», а затем я преобразовал это перечисляемое в наблюдаемую коллекцию.