包含字典<k,v>以使其可观察</k,v>

时间:2013-11-05 09:22:24

标签: c# wpf

我有一个模型对象树,我使用分层数据模板在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方法,但我也不喜欢其他选择。

1 个答案:

答案 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链接上提出的想法类似。