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)
{
//
}
}

ObservableCollection的更多相关文章

  1. c#中ObservableCollection<T>排序方法

    之前用到的一段代码,记录一下 public static class ObservableExtension { public static void Sort<TSource, TKey> ...

  2. 【WPF】WPF中的List<T>和ObservableCollection<T>

    在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...

  3. MVVM ObservableCollection<> ListView

    目标:在ListView中,设两列,一列表示人的姓名,一列表示年龄,用ObservableCollection<>来实现. 编程: 1)定义类Person public class ABC ...

  4. 由一个订单推送想到了ObservableCollection的神奇用法

    最近在做taobao的一个卖家应用,需要订阅taobao的订单推送,示例代码如下: 看到上面的OnMessage场景之后,我突然就鬼使神差的在想最近写的一个服务,其中的一个功能是需要定时的轮询一个集合 ...

  5. 【2016-10-13】【坚持学习】【Day4】【WPF】【ObservableCollection<T>】

    今天在项目中使用到这个 ObservableCollection<T> 类,作为数据源集合绑定到控件. 当数据源发生变化,会通知界面显示. 如果用List<T> ,当数据源发生 ...

  6. list<T>与ObservableCollection<T>

    list<T>与ObservableCollection<T>的用法基本上是一样的.区别: list<T>: 当T继承于INotifyPropertyChanged ...

  7. 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedFilesVector VirtualizedItemsVector 绑定

    [源码下载] 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedF ...

  8. wpf 绑定ObservableCollection 的Count属性

    相信大家都遇到过这样的需求,DataGrid里显示符合筛选条件的学生列表,上方TextBolck里显示学生总数,大家可以这样做: 1,XAML代码 <Window x:Class="O ...

  9. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

  10. windowsphone 中CollectionViewSource和ObservableCollection的使用

    功能描述:一级菜单省份  联动显示省份下的城市 直接上代码 public class City { public string Num { get; set; } public string Name ...

随机推荐

  1. vdp配置

    转:http://jiangjianlong.blog.51cto.com/3735273/1902879 本文将介绍VDP 6.1.2的部署与配置,主要内容包括部署VDP的OVA模板.初始化配置VD ...

  2. MongoDB 进阶

    一.MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允 ...

  3. python orm字段解析

    null # 是否可以为空 default # 默认值 primary_key # 主键 db_column # 列名 db_index # 索引(db_index=True) unique # 唯一 ...

  4. C# 序列化简单格式XML

    问师傅反序列化和序列化到底是什么, 然后师傅鄙视一下我的智商,让我做个反序列化解析XML. 一边听着师傅在旁边跟女朋友打电话收到暴击伤害,一边写,搞了一个半小时. XML文件: <?xml ve ...

  5. 中国气象局某分院官网漏洞打包(弱口令+SQL注入+padding oracle)

    漏洞一.后台弱口令 后台地址:http://www.hnmatc.org/admin/ 直接爆破得到账号admin  密码admin888 漏洞二.SQL注入(前台后台都有) 注入点:http://w ...

  6. 【转载】VC操作剪切板

    1.在剪切板上放置数据 if(OpenClipboard())    //打开剪切板{    EmptyClipboard(); //清空剪切板    CString str;       //从控件 ...

  7. IEEE Bigger系列题解

    Bigger系列题解 Bigger Python 坑点在于要高精度以及表达式求值,用java写可以很容易避免高精度问题 然后这道题就可以AC了 代码 import java.io.*; import ...

  8. hdu 4452 Running Rabbits 模拟

    Running RabbitsTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. 原生+H5开发之:Android webview配置

    在上一篇文章Android 原生开发.H5.React-Native开发特点,我们可以了解到三种Android开发方式的区别和优缺点.[Android开发:原生+H5]系列的文章,将主要讲解Andro ...

  10. CentOS7LINUX 内核调试符号安装

    yum install -y kernel-devel # debuginfo,在CentOS7中需要这样装 sudo vim /etc/yum.repos.d/CentOS-Debuginfo.re ...