1)可以使绑定控件与基础数据源保持同步
2)还可以在您添加、删除、移动、刷新或替换集合中的项目时引发 CollectionChanged
事件
3)还可以在您的窗口以外的代码修改基础数据时做出反应
4)相互转换
T tList = new List(tObjectStruct .ToList());
ObservableCollection
tObjectStruct = new ObservableCollection(tList);
都在构造函数中即可完成
也可以:
tList.ForEach(p => tObjectStruct.Add(t));
ObservableCollection类的应用
1.1.1.
简介
ObservableCollection类是Silverlight/WPF提供的用于数据绑定的集合类。它可以使绑定控件与基础数据源保持同步,如在绑定窗口外代码修改绑定数据源时可以做到同时更新绑定页面。更强大的是ObservableCollection
类还可以在您添加、删除、移动、刷新或替换集合中的项目时做到无刷新的更新页面显示。
1.1.2.
应用场景
在工程项目管理系统中经常要在页面显示大量具有层次结构的数据,如“模板维护”页面有800多项任务以树形列表的方式显示在页面。而我们要做的工作包括直接更改某个或多个任务项的属性,从别的窗口更改某个或多个任务项的属性;删除、添加、移动任务项。如果应用以前的经验页面空间绑定DataTable或普通集合,则需要编写很多代码来实现上述要求,而且不可避免的要刷新页面。代码量巨大而且用户体验也不好。而ObservableCollection
类则很好的解决了上述问题。
1.1.3. 应用示例
ObservableCollection 类从 Collection(Of
T)(泛型集合的基类)继承而来,并实现了 INotifyPropertyChanged和INotifyCollectionChanged
两个接口。每当ObservableCollection的项发生属性更改或项目添加、删除等,它就会广播有关对其元素所做的更改的信息,绑定的页面也就做到了自动无刷新更新。
接下来让我们看看具体的使用方法。E_ProjectPlan是工程项目管理系统里的任务项的实体类,它包含了很多属性,如:工作项代码、工作项名称、责任人、责任部门等。它了实现INotifyPropertyChanged
接口,以便属性值发生更改时会通知该类实例和绑定的界面,代码如下:
/// <summary>
/// 任务项实体类
///
</summary>
public class E_ProjectPlan : INotifyPropertyChanged
{}
在实现INotifyPropertyChanged 接口时,它必须提供 PropertyChanged
事件和OnPropertyChanged方法,代码如下:
//声明属性更改事件
public event
PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// 当属性更改时出发更改通知
/// </summary>
/// <param
name="propertyName">更改的属性名称</param>
public void
NotifyPropertyChanged(string propertyName)
{
if
(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后,在属性的发生改变时调用 OnPropertyChanged:
///
<summary>
/// 任务名称
/// </summary>
public
string WorkNM
{
get { return _worknm; }
set
{
_worknm = value;
NotifyPropertyChanged("DisplayIndex");
}
}
接下来就是应用我们的实体类了,在页面中创建一个E_ProjectPlan的ObservableCollection集合:
public
ObservableCollection<E_ProjectPlan> datalist = new
ObservableCollection<E_ProjectPlan>();
最后把集合绑定到控件,工作就完成了。现在只要操作datalist集合就可以在画面上实现更新、添加、删除、移动的功能了,而且是无刷新的!
应用了ObservableCollection的INotifyPropertyChanged。对于INotifyCollectionChanged我们可以应用它捕捉集合中的更改事件,来做相应的处理。示例代码如下:
((INotifyCollectionChanged)this.datalist).CollectionChanged
+= new
NotifyCollectionChangedEventHandler(MainPage_CollectionChanged);
///
<summary>
/// 数据集合发生变化
/// </summary>
public
void datalist_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs
e)
{
if (e.Action ==
NotifyCollectionChangedAction.Add)
{
//
}
if
(e.Action == NotifyCollectionChangedAction.Remove)
{
//
}
}