2010-04-21 47 views
0

我绑定了一个ListView属性,基本上包装值集合(ICollection)在通用字典上。WPF绑定到IDictionary <int,MyType>。值不响应属性更改?

当字典中的值发生变化时,我调用OnNotifyPropertyChanged(property)。我没有看到屏幕上的更新,没有绑定错误。

当我改变属性getter返回Linq扩展dictionary.Values.ToList(),而不改变属性的签名(ICollection)它没有问题。

为什么Values集合绑定并正确通知而没有投影到IList <>?

回答

2

调用OnNotifyPropertyChanged()在这种情况下不完全正确,因为集合仍然相同,但集合中的项目已更改。我不知道WPF绑定代码是如何工作的,但它可能会快速检查它是否绑定到的引用已更改,如果没有,它将不会更新UI。

ToList()的工作原因是因为每次调用该函数时都会返回一个新的List<T>实例,因此当触发OnNotifyPropertyChanged()时,WPF会选择该更改并更新其所有绑定。

我不知道这是否可行,但理想的解决方案是使用集合实现INotifyCollectionChanged的绑定。这将触发WPF监视的事件,以便可以根据需要从UI添加,删除项目等。

+0

有趣的,虽然我认为这就是所谓的PropertyChanged完成。在大多数情况下(并且在大多数例子中),这被放置在设置器中,并且仅在值/参考改变时才被调用。这实际上正是我认为我的方法可行的原因 - 我认为PropertyChanged调用导致了更新,而不是值/参考的更改。 – 2010-04-21 19:12:34

+0

有一些实现INotifyCollectionChanged的字典的例子。尝试搜索ObservableDicitonary。 – 2010-04-21 19:23:15

+0

@Phil @Andy是正确的,因为WPF绑定系统将引用作为优化来检查。如果引用不改变,它不会更新绑定。这就是INotifyCollectionChanged接口存在的原因。 – 2010-04-21 19:25:06