列表与LT;>集合不会更新MVVM中的View

时间:2012-05-15 09:56:44

标签: wpf mvvm

我使用List<Person> collection作为DataGrid控件的ItemsSource。

但如果我从List集合中删除该项,则它不会更新View。我在解决方案上苦苦挣扎了很长时间。

然后,而不是我的ViewModel中的List<Person>集合。我将其更改为ObservableCollection<Person> collection。现在,当集合发生变化时,它会更新视图。

我不确定为什么只更新ObservableCollection<Person>?任何人?

4 个答案:

答案 0 :(得分:4)

嗯它的名字。一个简单的List不会告诉ui更新,换句话说“视图无法观察列表”。数据绑定背后没有奇怪的魔力。 WPF和DataBinding需要数据模型告诉他们“这是新的”或“这已被更改”,您可能已经看到INotifyPropertyChangedINotifyCollectionChanged是相同的但是对于集合,{{1} } {没有实现它,ObservableCollection确实如此。

答案 1 :(得分:1)

每次更改集合中的项目时,

ObservableCollection<T>都会触发更改事件。 List<T>没有。这就是原因。

DataBinding是懒惰的。如果你没有告诉你的观点,某些事情发生了变化,那就不会打扰更新了。在引擎盖下,WPF DataBinding注册了更改通知,以便ViewModel可以告知视图何时发生更改。它通过INotifyPropertyChangedINotifyCollectionChanged等接口执行此操作。

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