KeyValuePair
未实现INotifyPropertyChanged
,因此我实现了自己的Pair
类型,但我想在字典中使用它。
最简单的方法是什么?
所以这是交易。在我的代码中,我需要一个带键/值对的字典。这实际上不需要是可观察的。
我有一个编辑窗口,它在数据网格中显示这个dict。这需要是可观察的,以便数据网格可以发挥其魔力。
所以我所做的就是让编辑窗口接受任意数量的对:
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));
所以我添加了这两个辅助方法:
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);
}
虽然看起来有点贵。我现在两次循环收集。一旦将字典转换为可枚举,然后再次深度复制它,以便变量在用户点击保存之前不会被更改,然后我将该可枚举转换为可观察集合。
答案 0 :(得分:2)
您是否尝试通知值更改?如果是这样,我会考虑编写一个支持Wrapper<T>
的{{1}}类,然后使用(例如)INotifyPropertyChanged
(对于支持更改通知的“string / int”字典)。
请注意,这意味着任何保留对包装器的引用的人都会看到对该值所做的更改 - 这是您必须非常小心的事情。
编辑:稍微扩展我的评论......
如果你也希望能够编辑密钥,我怀疑你会想要一个可变的TKey / TValue对,你需要一个Dictionary<string, Wrapper<int>>
。您需要支持Dictionary<TKey, MutablePair<TKey, TValue>>
以及INotifyPropertyChanging
,它会变得毛茸茸......您可能需要通过INotifyPropertyChanged
上的键删除它,然后在INotifyPropertyChanging
上重新添加。毫无疑问,如果改变被中途放弃,事情会变得混乱。如果一个键覆盖了另一个键,你还需要弄清楚你想要发生什么......然后原始对象被改变了:
INotifyPropertyChanged
基本上有很多语义需要仔细考虑真的,然后才能进一步思考。
我建议您为要实现的行为编写 lot 单元测试,然后看看你能做些什么。
答案 1 :(得分:1)