C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件

01

概述

     ObservableCollection继承了INotifyPropertyChanged接口,在属性变更时可以通知界面,当我把ObservableCollection集合绑定到界面的DataGrid后,我希望在界面修改表格数值后,可以触发一个 事件来验证我界面设定数据的有效性,但是对于集合的添加、删除只会触发集合的get属性,值重置不会触发集合的get、set属性,这时候我们就需要扩展ObservableCollection集合.

02


集合扩展

代码如下:重写OnCollectionChanged方法,使得集合改变(增添、删除、改变)时拥有属性变更事件

using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using DevExpress.Xpo;namespace Caliburn.Micro.Hello
{public class ItemsChangeObservableCollection<T> :System.Collections.ObjectModel.ObservableCollection<T> where T : INotifyPropertyChanged{protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{if (e.Action == NotifyCollectionChangedAction.Add){RegisterPropertyChanged(e.NewItems);}else if (e.Action == NotifyCollectionChangedAction.Remove){UnRegisterPropertyChanged(e.OldItems);}else if (e.Action == NotifyCollectionChangedAction.Replace){UnRegisterPropertyChanged(e.OldItems);RegisterPropertyChanged(e.NewItems);}base.OnCollectionChanged(e);}protected override void ClearItems()
{UnRegisterPropertyChanged(this);base.ClearItems();}private void RegisterPropertyChanged(IList items)
{foreach (INotifyPropertyChanged item in items){if (item != null){item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);}}}private void UnRegisterPropertyChanged(IList items)
{foreach (INotifyPropertyChanged item in items){if (item != null){item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);}}}private void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{//launch an event Reset with name of property changedbase.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));}}
}

03


事件订阅

可以用如下方法订阅事件:

this.StudentList.CollectionChanged += StudentList_OnCollectionChanged;
或
StudentList.CollectionChanged += new NotifyCollectionChangedEventHandler(StudentList_OnCollectionChanged);

事件方法:

public void StudentList_OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e){MessageBox.Show("当前触发的事件是:"+ e.Action.ToString());}

集合定义:

private ItemsChangeObservableCollection<Students> studentList;public ItemsChangeObservableCollection<Students> StudentList{get{return studentList;}set{studentList = value;}}

04


效果演示

3f0993c7f2517b274606659017d807ab.gif

源码下载

网盘下载链接:https://pan.baidu.com/s/1TD2BT5hiT-z-_7Z2Bn3PVQ

提取码:添加小编微信获取

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘算法之决策树算法总结

机器学习中&#xff0c;决策树是一个预测模型&#xff1b;它代表的是对象属性值与对象值之间的一种映射关系。树中每个节点表示某个对象&#xff0c;每个分叉路径则代表的某个可能的属性值&#xff0c;而每个叶结点则对应具有上述属性值的子对象。决策树仅有单一输出&#xff1…

win7升级win10正式版_win7告退在即,如何升级到win10?

Win7即将停更&#xff0c;小伙伴们也差不多要进行自己系统的更新啦&#xff0c;今天小白就教大家如何将Win7升级到Win10第一步&#xff1a;首先在官网 www.xiaobaixitong.com 下载“小白软件”第二步&#xff1a;选好我们要下载的系统&#xff0c;然后安装即可。第三步&#xf…

在24小时内学完所有的数学是种什么体验?我们做了这个大胆的尝试……

全世界只有3.14 % 的人关注了爆炸吧知识人还好就是没了而已其实&#xff0c;在此时&#xff0c;还有一件事情发生了。22:00&#xff0c;我们发出了这篇文章&#xff0c;不仅将2600多年的数学简史浓缩成24小时&#xff0c;还将2600多年数学简史浓缩成54张卡牌。每张卡牌背后都有…

Server Develop (八) IOCP模型

IOCP模型 IOCP全称I/O Completion Port&#xff0c;中文译为I/O完成端口。IOCP是一个异步I/O的Windows API&#xff0c;它可以高效地将I/O事件通知给应用程序&#xff0c;类似于Linux中的Epoll。 简介 IOCP模型属于一种通讯模型&#xff0c;适用于Windows平台下高负载服务器的一…

理解RESTful架构

2019独角兽企业重金招聘Python工程师标准>>> 原文&#xff1a;http://www.ruanyifeng.com/blog/2011/09/restful.html?20160826000527 越来越多的人开始意识到&#xff0c;网站即软件&#xff0c;而且是一种新型的软件。 这种"互联网软件"采用客户端/服务…

凡是过往,皆为序章。

凡是过往&#xff0c;皆为序章今天是元旦假期的最后一天&#xff0c;这三天我一直在想&#xff0c;21年的年终总结应该如何下笔。其实心里面想表达和记录的事情很多&#xff0c;可当真正坐在电脑前时&#xff0c;却发现没有头绪。贵有恒&#xff0c;何必三更起五更眠。最无益&a…

查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...

先整体了解一下如何查看文件内容的命令vi 兼有修改功能的查看方式&#xff0c;会单独打开整个文件vim 可修改文件内容并且显示当前查看位置在文件中的%多少cat 由第一行开始显示内容&#xff0c;并将所有内容输出tac 从最后一行倒序显示内容&#xff0c;并将所有内容输出more…

crond定时任务详细分析

一、定时任务crond的介绍 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情况下&#xff0c;我们安装文成系统之后&#xff0c;默认变回启动crond任务调度服务&#xff0c;crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。…

OCS2007R2升级LyncSrv2013 PART4:关联边缘

完成拓扑的合并后&#xff0c;由于边缘服务器尚未做迁移和升级&#xff0c;所以此时我们的Lync Server没有边缘服务、联盟路由等。我们就可以把OCS的边缘服务器与Lync Server前端进行关联&#xff0c;暂时使用OCS的联盟路由和边缘服务。要关联OCS边缘服务器&#xff0c;需要打开…

2021技术文大盘点 | 打包过去,​面向未来

先用四句诗词快速描述 一下我的写作心得1. 只在此山中&#xff0c;云深不知处作为开发人员&#xff0c;常执着于机器0,1代码&#xff0c;非假既真&#xff1b;真实世界是很主观的&#xff0c;需要精致细节&#xff0c;更多时候需要全局把控。带着问题写作&#xff0c;对事物理解…

Ansible 一步一步从入门到精通(一)

一&#xff1a;安装ansiblemac&#xff1a;1. 安装 Homebrew (get the installation command from the Homebrew website).2. 安装Python 2.7.x ( brew install python ).3. 安装 Ansible ( sudo pip install ansible ).linux&#xff1a;如果系统中安装了python-pip和python-d…

客户细分总结

随着营销方式的多变、客户需求各异、营销增长受阻等多方面影响&#xff0c;企业的营销面临前所未有的挑战和机遇&#xff0c;精准化营销似乎已成为很多公司的选择&#xff0c;本文针对以下客户细分五大模块进行总结&#xff1a; 一&#xff1a;客户细分的必要性&#xff1a; 顾…

Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份

http://www.tektea.com/archives/2163.html。 在《Linux操作系统备份之一&#xff1a;使用LVM快照实现Linux操作系统数据的在线备份》文章中&#xff0c;我们介绍了使用LVM快照实现操作性系统在线备份的方法&#xff0c;LVM快照可以实现在线操作系统数据的备份&#xff0c;在线…

cad快捷命令大全_最全CAD快捷键命令大全(图文版、文字版、键盘版)

在 CAD操作中我们常用一些快捷键来代替鼠标操作从而提高绘图效率&#xff0c;以下是小编为大家整理的常用快捷键大全&#xff0c;涵盖图文版、文字版、键盘版。图文版&#xff1a;文字版&#xff1a;一、常用功能键F1: 获取帮助F2:实现作图窗和文本窗口的切换F3:控制是否实现对…

WEB API:语音识别

2019独角兽企业重金招聘Python工程师标准>>> x-webkit-speech 语音输入功能&#xff1a; http://www.iinterest.net/2012/01/07/x-webkit-speech/ HTML5语音输入&#xff08;淘宝语音搜索&#xff09;x-webkit-speech方法 支持webkit内核&#xff1a; http://www.wu…

cad在线转换_CAD转PDF批量转换怎么转?教你一次性操作,一看就会

接触AutoCAD设计&#xff0c;自然离不开各种的格式转换&#xff0c;CAD转PDF&#xff0c;CAD转JPG、CAD版本转换……感觉不知道哪里下手。特别是批量进行转换操作&#xff0c;更是没有头绪&#xff0c;其实很简单&#xff0c;这里教你一招轻松转换&#xff0c;看一遍变就会操作…

怎么写一个高性能应用?

首先声明&#xff0c;这不是写一个高性能应用的唯一选择&#xff0c;只是自己实践后的一些心得分享。开发前定个小目标有目标的好处是不会降配开发&#xff0c;也不会过度开发目标指标&#xff1a;并发数&#xff0c;TPS&#xff0c;响应时间等1、模块独立性让路高性能&#xf…

[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

为了更好的排版, 所以将IK分词器的安装重启了一篇博文, 大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://www.cnblogs.com/wang-meng/p/5814798.html8, 打开浏览器查看solr可视化界面到了这里solr就配置好了, 可是我们的IK …