1

我有一个模型对象树,我使用分层数据模板在 TreeView 中显示它。每个模型对象都使用 ValueConverter 动态转换为 ViewModel 对象,但模型的属性仍然绑定到分层数据模板中的子项。

我遇到的问题是模型对象将它们的子对象存储在字典中,并且它特别是值,而不是我对客户端感兴趣的键。字典不是可观察的,所以我正在寻找的是 - 在一个理想的世界中 - 一种包装字典的方法(或者更具体地说,字典在“值”属性上使用的内部 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 方法,但我也不喜欢其他替代方法。

4

1 回答 1

0

你可以实现IDictionary<TKey, TValue>接口。在内部,您将使用字典,因此您的类将充当客户端和真实字典之间的代理。但是,您也会引发事件,如下所示:

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 链接上的想法相似。

于 2013-11-05T09:31:32.680 回答