Welcome

首页 / 软件开发 / .NET编程技术 / 高级基础知识:ObservableCollection类

高级基础知识:ObservableCollection类2011-12-21 MSDN Ken Getz假设您正在创建 Windows 窗体应用程序,并且已将 DataGridView 控件绑定到标准 List(Of Customer) 数据结构。您希望能够使网格中的项目与基础数据源中的值保持同步。也就是说,如果其他代码或其他窗体更改了 List 中用户的数据,您希望网格随之更新并显示修改的数据。

通常情况下,使用 Windows 窗体可以实现此目的。您可以进行更新,但这种方法很受限制。例如,在正常情况下,您可以立即在网格中看到更新,但是如果有人向数据源中添加新行,则要向网格中添加新行可就没那么容易了。Windows Presentation Foundation (WPF) 在 Microsoft .NET Framework 中添加了一些功能,所以您实际上可以可靠地使绑定控件与其数据源保持一致。我将在本文中演示如何使用 WPF 提供的 ObservableCollection 类。

利用 ObservableCollection 类,WPF 应用程序可以使绑定控件与基础数据源保持同步,但它还提供了更有用的信息,尤其是 ObservableCollection 类还可以在您添加、删除、移动、刷新或替换集合中的项目时引发 CollectionChanged 事件。此功能还可以在您的窗口以外的代码修改基础数据时做出反应。在本月的示例应用程序中,您将了解到如何使用此信息,这正是接下来我要介绍的内容。

ObservableCollection 类简介

System.Collections.ObjectModel.ObservableCollection(Of T) 类从 Collection(Of T)(泛型集合的基类)继承而来,可实现 INotifyCollectionChanged 和 INotifyPropertyChanged 两种接口。INotifyCollectionChanged 接口增加了集合的趣味性,同时也是允许绑定对象(和代码)确定集合是否已发生更改的接口。

值得注意的是,虽然 ObservableCollection 类会广播有关对其元素所做的更改的信息,但它并不了解也不关心对其元素的属性所做的更改。也就是说,它并不关注有关其集合中项目的属性更改通知。

如果您需要了解是否有人更改了集合中某个项目的属性,则您将需要确保集合中的项目可以实现 INotifyPropertyChanged 接口,并需要手动附加这些对象的属性更改事件处理程序。无论您如何更改此集合中的对象属性,都不会触发该集合的 PropertyChanged 事件。事实上,ObservableCollection 的 PropertyChanged 事件处理程序已受到保护 — 除非您从此类中继承并亲自将其公开,否则您甚至无法对其做出反应。在示例应用程序中,我采用的方法比较简单,让客户端应用程序处理单个项目的更改事件,当然,您也可以在继承的集合中处理该集合内每个项目的 PropertyChanged 事件。

如果您忽略了继承的受保护成员(假设您已经熟悉从其中派生 ObservableCollection 类的所有成员的 Collection 基类),则剩下的有趣成员仅有 Move 方法(允许您将某个成员移动到集合中的新位置)和 CollectionChanged 事件(广播有关对集合内容所做的更改的信息)。继续阅读之前,您可能需要下载并安装演示这些功能的示例 WPF 应用程序。