我有一个模型对象树,我使用分层数据模板在TreeView中显示。使用ValueConverter将每个模型对象动态转换为ViewModel对象,但模型的属性仍然绑定到分层数据模板中的子项。
我遇到的问题是Model对象将他们的孩子存储在词典中,而且特别是值,而不是我对客户端感兴趣的键。字典不是Observable,所以我想要的是 - 在一个理想的世界中 - 一种包装字典的方法(或者更具体地说是字典在“Values”属性上使用的内部ValueCollection,以使其可观察
我已经深入研究了词典的来源,看看是否有任何可以反映的隐藏钩子,但我看不到任何东西。
有人有建议吗?
编辑:
我想要的行为实际上是这样的:
var nonObservable = new Dictionary<Guid, object>();
var observableDictionary = new ObservableDictionary<Guid, object>(nonObservable);
observableDictionary.CollectionChanged += //Some event handler
nonObservable.Add(Guid.NewGuid, new object());
当我将对象添加到不可观察的字典时,我想要在包装器上触发一个集合已更改事件。这可能需要一些深刻的反思。这是一种我宁愿避免的hacky方法,但我也不喜欢其他选择。
答案 0 :(得分:0)
您可以实现IDictionary<TKey, TValue>
界面。在内部,您使用的是Dictionary,因此您的类将充当客户端和真实字典之间的代理。但是,你也会提出这样的事件:
public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
private IDictionary<TKey, TValue> _dictionary = //...
public event EventHandler<DictionaryChangedArgs> OnAdded;
public ObservableDictionary()
{
_dictionary = new Dictionary<TKey, TValue>();
}
//wrap an existing dictionary
public ObservableDictionary(IDictionary<Tkey, TValue> dictionary)
{
_dictionary = dictionary;
}
public void Add(TKey key, TValue val) {
_dictionary.Add(key, value);
if(OnAdded != null)
OnAdded(new DictionaryChangedArgs(key, value));
}
}
修改强>
更新了代码以反映您的要求:“包装现有字典”。 这个想法似乎与dav_i链接上提出的想法类似。