3

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

但是,如果我从 List 集合中删除该项目,它不会更新视图。我为解决方案苦苦挣扎了很长时间。

然后代替List<Person>我的 ViewModel 中的集合。我把它改成了ObservableCollection<Person> collection. 现在它会在集合发生变化时更新视图。

我不知道为什么它只更新ObservableCollection<Person>?任何人 ?

4

4 回答 4

5

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

于 2012-05-15T10:00:34.003 回答
1

ObservableCollection<T>每次更改集合中的项目时都会触发更改事件。List<T>没有。这就是原因。

DataBinding 是惰性的。如果您不告诉您的视图某些内容发生了变化,它就不会打扰更新。在后台,WPF DataBinding 注册更改通知,以便您的 ViewModel 可以在视图发生更改时告知视图。它使用 和 之类的接口来做到这INotifyPropertyChanged一点INotifyCollectionChanged

ObservableCollection<T>实现接口INotifyCollectionChanged。此接口定义事件CollectionChanged,您的 View 基本上将其自己的事件处理程序附加到该事件。当集合引发事件时,该处理程序将更新视图。

于 2012-05-15T10:00:45.223 回答
1

因为 List 没有实现INotifyCollectionChanged

于 2012-05-15T10:01:15.067 回答
1

因为数据绑定的更新不是一种魔法,所以要使数据绑定正常工作有几个要求。如果您有单个属性要绑定在此属性上,则该属性必须是依赖属性或其父类必须实现 INotifyPropertyChanged 接口以通知 wpf 绑定系统有关属性值的更改。对于集合,有一个类似的机制:它必须实现 INotifyPropertyChanged 以通知 wpf 绑定系统有关已删除/已移动/已添加的项目。

有关更多详细信息,请参见此处:http: //msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

于 2012-05-15T10:02:51.053 回答