我使用List<Person> collection
作为DataGrid控件的ItemsSource。
但如果我从List集合中删除该项,则它不会更新View。我在解决方案上苦苦挣扎了很长时间。
然后,而不是我的ViewModel中的List<Person>
集合。我将其更改为ObservableCollection<Person> collection
。现在,当集合发生变化时,它会更新视图。
我不确定为什么只更新ObservableCollection<Person>
?任何人?
答案 0 :(得分:4)
嗯它的名字。一个简单的List不会告诉ui更新,换句话说“视图无法观察列表”。数据绑定背后没有奇怪的魔力。 WPF和DataBinding需要数据模型告诉他们“这是新的”或“这已被更改”,您可能已经看到INotifyPropertyChanged,INotifyCollectionChanged是相同的但是对于集合,{{1} } {没有实现它,ObservableCollection确实如此。
答案 1 :(得分:1)
ObservableCollection<T>
都会触发更改事件。 List<T>
没有。这就是原因。
DataBinding是懒惰的。如果你没有告诉你的观点,某些事情发生了变化,那就不会打扰更新了。在引擎盖下,WPF DataBinding注册了更改通知,以便ViewModel可以告知视图何时发生更改。它通过INotifyPropertyChanged
和INotifyCollectionChanged
等接口执行此操作。
ObservableCollection<T>
实现了接口INotifyCollectionChanged
。此接口定义事件CollectionChanged
,您的View基本上将其附加到其自身的事件处理程序。该处理程序将在集合引发事件时更新视图。
答案 2 :(得分:1)
因为List没有实现INotifyCollectionChanged
答案 3 :(得分:1)
因为数据绑定的更新不是一种魔术,所以有几个要求使数据绑定正常工作。如果要在此属性上绑定的单个属性必须是依赖项属性,或者其父类必须实现INotifyPropertyChanged接口,以通知wpf绑定系统有关属性值的更改。 对于集合,有一个simelar机制:它必须实现INotifyPropertyChanged以通知wpf绑定系统有关已删除/移动/添加的项目。
请点击此处了解详情:http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx