List<>集合在MVVM中不会更新视图

3

我在DataGrid控件中使用了List<Person>集合作为ItemsSource。

但是,如果我从List集合中移除项目,它不会更新视图。我为解决这个问题苦苦挣扎了很长时间。

然后,我将ViewModel中的List<Person>集合改为了ObservableCollection<Person>集合。现在,只要集合发生变化,它就会更新视图。

我不确定为什么只有ObservableCollection<Person>能够更新?有人知道吗?


请参见以下关于编程的内容:https://dev59.com/OW855IYBdhLWcg3wsWlq - Miklós Balogh
4个回答

5

名称就是它的含义。一个简单的列表不能告诉UI进行更新,换句话说,“视图不能观察列表”。数据绑定背后没有任何神秘的魔力。WPF和数据绑定需要数据模型告诉它们“这是新的”或“这已经改变了”,您可能已经看到了INotifyPropertyChangedINotifyCollectionChanged 是针对集合的相同概念,而 List<> 并未实现它,ObservableCollection 则实现了。


1

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

DataBinding 是惰性的。如果您不告诉视图某些内容已更改,它就不会费心更新。在幕后,WPF DataBinding 注册了更改通知,以便您的 ViewModel 可以在更改时告诉视图。它使用像INotifyPropertyChangedINotifyCollectionChanged这样的接口来实现。

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


1

1

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

请参阅此处获取更多详细信息:http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接