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. 1024 Palindromic Number (25)(25 point(s))

    problem A number that will be the same when it is written forwards or backwards is known as a Palind ...

  2. 解决mongo 端口占用问题

    在打开mongod之后如果不用了就按ctrl + c ,就不会出现以下的问题了 执行mongod报错 mongod 2016-08-03T14:31:15.691+0800 I CONTROL [in ...

  3. SKLearn数据集API(二)

    注:本文是人工智能研究网的学习笔记 计算机生成的数据集 用于分类任务和聚类任务,这些函数产生样本特征向量矩阵以及对应的类别标签集合. 数据集 简介 make_blobs 多类单标签数据集,为每个类分配 ...

  4. BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...

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

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

  6. 2018-2019-2 20162318《网络对抗技术》Exp4 恶意代码分析

    一.实验目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systracer套件 ...

  7. [CC-MCHEF]MasterChef

    [CC-MCHEF]MasterChef 题目大意: \(n(n\le10^5)\)片花,第\(i\)片花的美观度为\(b_i(|b_i|\le10^9)\).总体美观度为各片花的美观度之和. 由于有 ...

  8. php远程获取图片或文件信息(get_headers,fsocketopen,curl)

    <?php if(!function_exists("remote_filesize")){ /** * 获取远程或本地文件信息 * @param string $strUr ...

  9. PostgreSQL 资料库

    https://yq.aliyun.com/articles/59251 https://github.com/digoal/blog/blob/master/201609/20160929_02.m ...

  10. MFC小程序------01 代码管理器

    1.代码入库: 2.代码查找: 3.查看全部代码: 4.程序设置: 自己学习MFC写的一个小程序,当中还有很多功能还待完好,比方数据库的导入功能还没有写,但导出功能是能够用的,查找算法也不是非常好,还 ...