1.1.1. 简介

ObservableCollection类是Silverlight/WPF提供的用于数据绑定的集合类。它可以使绑定控件与基础数据源保持同步,如在绑定窗口外代码修改绑定数据源时可以做到同时更新绑定页面。更强大的是ObservableCollection 类还可以在您添加、删除、移动、刷新或替换集合中的项目时做到无刷新的更新页面显示。

1.1.2. 应用场景

在工程项目管理系统中经常要在页面显示大量具有层次结构的数据,如模板维护页面有800多项任务以树形列表的方式显示在页面。而我们要做的工作包括直接更改某个或多个任务项的属性,从别的窗口更改某个或多个任务项的属性;删除、添加、移动任务项。如果应用以前的经验页面空间绑定DataTable或普通集合,则需要编写很多代码来实现上述要求,而且不可避免的要刷新页面。代码量巨大而且用户体验也不好。而ObservableCollection 类则很好的解决了上述问题。

1.1.3. 应用示例

ObservableCollection 类从 Collection(Of T)(泛型集合的基类)继承而来,并实现了 INotifyPropertyChangedINotifyCollectionChanged 两个接口。每当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_ProjectPlanObservableCollection集合:

public ObservableCollection<E_ProjectPlan> datalist = new ObservableCollection<E_ProjectPlan>();

最后把集合绑定到控件,工作就完成了。现在只要操作datalist集合就可以在画面上实现更新、添加、删除、移动的功能了,而且是无刷新的!

应用了ObservableCollectionINotifyPropertyChanged。对于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)
                    {
                                          //
                      }
     }

posted on 2011-05-03 11:43  陈高  阅读(648)  评论(1编辑  收藏  举报