C# 包装一本字典<;K、 V>;使其可见

C# 包装一本字典<;K、 V>;使其可见,c#,wpf,C#,Wpf,我有一个模型对象的树,我使用分层数据模板在树视图中显示它。每个模型对象都使用ValueConverter动态转换为ViewModel对象,但模型的属性仍然绑定到分层数据模板中的子项 我遇到的问题是,模型对象将其子对象存储在字典中,我对客户端感兴趣的是值,而不是键。字典是不可观察的,所以在理想情况下,我要寻找的是一种包装字典的方法(或者更具体地说,是字典对“Values”属性使用的内部ValueCollection,以便使其可观察 我已经深入研究了字典的来源,看看是否有任何隐藏的钩子可以反映出来,

我有一个模型对象的树,我使用分层数据模板在树视图中显示它。每个模型对象都使用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接口编程的,你可以将他们的字典与你的字典交换。你可以通过策略注入来实现这一点,这就是我最初的评论。在你的回答中,客户必须知道调用可观察类而不是原始类。