C# 包装一本字典<;K、 V>;使其可见
我有一个模型对象的树,我使用分层数据模板在树视图中显示它。每个模型对象都使用ValueConverter动态转换为ViewModel对象,但模型的属性仍然绑定到分层数据模板中的子项 我遇到的问题是,模型对象将其子对象存储在字典中,我对客户端感兴趣的是值,而不是键。字典是不可观察的,所以在理想情况下,我要寻找的是一种包装字典的方法(或者更具体地说,是字典对“Values”属性使用的内部ValueCollection,以便使其可观察 我已经深入研究了字典的来源,看看是否有任何隐藏的钩子可以反映出来,但我什么也看不到 有人有什么建议吗 编辑: 我想要的行为实际上是:C# 包装一本字典<;K、 V>;使其可见,c#,wpf,C#,Wpf,我有一个模型对象的树,我使用分层数据模板在树视图中显示它。每个模型对象都使用ValueConverter动态转换为ViewModel对象,但模型的属性仍然绑定到分层数据模板中的子项 我遇到的问题是,模型对象将其子对象存储在字典中,我对客户端感兴趣的是值,而不是键。字典是不可观察的,所以在理想情况下,我要寻找的是一种包装字典的方法(或者更具体地说,是字典对“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());
var nonObservable=newdictionary();
var observedictionary=新的observedictionary(不可观测);
observableDictionary.CollectionChanged+//某些事件处理程序
添加(Guid.NewGuid,newobject());
当我将对象添加到不可见字典时,我希望在包装器上触发一个集合更改事件。这可能需要一些深入的思考。这是一种我宁愿避免的黑客方法,但我也不太喜欢替代方法。您可以实现
IDictionary
接口。在内部,您可以使用一个字典,因此您的类将充当客户端和真实字典之间的代理。但是,您还将引发事件,如下所示:
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));
}
}
public类observedictionary:IDictionary
{
专用词典_dictionary=/。。。
已添加公共事件事件处理程序;
公共医疗
{
_字典=新字典();
}
//包装现有词典
公共词典(IDictionary dictionary)
{
_字典=字典;
}
公共无效添加(TKey key,TValue val){
_添加(键、值);
如果(OnAdded!=null)
OnAdded(新字典更改(键、值));
}
}
编辑
更新代码以反映您的要求:“包装现有词典”。
这个想法似乎与dav_i的链接上的想法相似。人们已经制作了一些你可能会觉得有用的课程。感谢链接,但它不适合我的场景,因为我需要透明地包装现有词典,有效地“附加”可观察到的行为。请出示您的code@RBT我提供的链接提供了覆盖
newobservedictionary(existingDictionary)
…不好?你有没有考虑过策略注入?根据你所写的,它看起来可能是一个可行的解决方案。当然,这取决于你将整个事情联系起来的动机……我添加了代码,显示了我试图获得的问题行为。这并不像客户会继续使用不可观察的d那么简单ictionary.@dcastro,OP需要拦截对原始字典的调用。我认为即使使用反射也无法做到这一点。在这里使用可观察模式的替代方法是不断轮询字典的更改,这很昂贵,而且可能是问题的根源。您确定不能让代码的客户端使用observa吗如果他是针对IDictionary接口编程的,你可以将他们的字典与你的字典交换。你可以通过策略注入来实现这一点,这就是我最初的评论。在你的回答中,客户必须知道调用可观察类而不是原始类。