以下说明可解释自定义的事件的自定义触发过程:

直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件)

Form1 类(调用者端)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//CustomClass cc = new CustomClass(1, "Lee");//测试属性值不变化的情况
CustomClass cc = new CustomClass();//空构造函数,一边测试属性值改变
private void Form1_Load(object sender, EventArgs e)
{
            cc.Changed += new CustomClass.ChangedEventHandler(cc_Changed);//调用者端订阅事件,为Changed事件提供了具体的事件函数cc_Changed
}
private void button1_Click(object sender, EventArgs e)
{
            cc.Cid = 1;
            cc.Cname = "Lee";//给CustomClass的属性赋值,赋值是引发事件
string str = cc.Cid.ToString() + cc.Cname;
MessageBox.Show(str);
}
        private void cc_Changed()//事件  注:被自定义事件绑定的事件函数
{
textBox1.Text = cc.Cid.ToString();
textBox2.Text = cc.Cname;
}
}
 CustomClass类(事件定义端)
public class CustomClass
{
public delegate void ChangedEventHandler();//定义委托
public event ChangedEventHandler Changed;//定义事件
private int _Cid;
private string _Cname;
public CustomClass()
{
}
public CustomClass(int cCid, string cCname)
{
this._Cid = cCid;
this._Cname = cCname;
}
protected virtual void OnChanged()
{
if (Changed!=null)
{
Changed();
}
}
public int Cid
{
get
{
return _Cid;
}
set
{
if (_Cid!=value)//这里是文本改变时的处理
{
_Cid = value;
                    OnChanged();//启动事件
                    //注:变相的在更改值的过程中,调用了上面绑定的事件函数“cc_Changed()”,做到了对自定义事件的触发(cc_Changed()幻术的执行)         
                    //需要明白:在当前类CustomClass中,不能直接知道要执行的事件函数
                    //或者这么说:在定义自定义事件的类中,仅仅定义(1)事件本身及(2)可能在类中触发的事件调用(以本类而言,就是执行OnChanged()中的Changed()),具体调用哪个事件函数,是由“调用者端”提供的
}
}
}
public string Cname
{
get
{
return _Cname;
}
set
{
if (_Cname != value)
{
_Cname = value;
OnChanged();
}
}
}
}
}
以下是网上的一段非常经典的属性值改变引发自定义事件的例子,如下;
public class MyClass
{
public event EventHandler<PropertyChagedEventArgs> MyPropertyChanging;
public event EventHandler<PropertyChagedEventArgs> MyPropertyChanged;
private int _myProperty;
public int MyProperty
{
get { return _myProperty; }
set
{
if (value != _myProperty)
{
PropertyChagedEventArgs e = new PropertyChagedEventArgs("MyProperty", _myProperty, value);//初始化
if (this.MyPropertyChanging != null)
{
this.MyPropertyChanging(this, e);
if (e.Cancel) return;
}
_myProperty = (int)e.NewValue;
if (this.MyPropertyChanged != null)
{
this.MyPropertyChanged(this, e);
}
}
}
}
}
/// <summary>
/// 通用的类
/// </summary>
public class PropertyChagedEventArgs : EventArgs
{
public PropertyChagedEventArgs(string propertyName,object oldValue,object newValue)
{
PropertyName = propertyName;
OldValue = oldValue;
NewValue = newValue;
}
public bool Cancel { get; set; }
public string PropertyName { get; private set; }
public object OldValue { get; private set; }
public object NewValue { get; set; }
}

通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程相关推荐

  1. transitionend、change、classList、兼容代码、元素样式属性的操作、-Attribute自定义属性、阻止跳转、元素绑定相同事件、元素解绑事件、事件冒泡、事件三阶段

    transitionend过渡监听事件: 过渡监听事件transitionend指的是CSS3中过渡效果执行一次后触发事件处理函数,如下案例: <!DOCTYPE html><htm ...

  2. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  3. html 点击文本框则选中,JS事件 内容选中事件(onselect)选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行。...

    内容选中事件(onselect) 选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行. 如下代码,当选中用户文本框内的文字时,触发onselect 事件, ...

  4. java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)

    Callback回调事件介绍 Java或Android中创建异步回调最普遍的做法就是使用listener监听器或者observer观察者模式来解决,listener回调事件通常用于实现一个代码去监听另 ...

  5. html 自定义js,js 自定义事件

    js怎么自定义事件,并能让用on事件监听 你这个问题全部内容应该是如下吧: 在视频播放的时候,能够用on监听事件的触发,如下: player.on('pause',function(){ consol ...

  6. 学习旧岛小程序 (5) 自定义组件的自定义事件

    自定义组件的触发事件: 自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名.detail对象和事件选项: this.triggerEvent('like', { behavio ...

  7. html加上 extjs右键,extjs 处理HTML事件和自定义事件

    1. 处理HTML元素的标准事件 HTML元素的标准事件是指mouseover.mousedown.click. blur.focus.change等.在ExtJS中,这些事件的处理如下: 注册一个事 ...

  8. [Vue源码分析]自定义事件原理及事件总线的实现

    最近小组有个关于vue源码分析的分享会,提前准备一下- 前言: 我们都知道Vue中父组件可以通过 props 向下传数据给子组件:子组件可以通过向$emit触发一个事件,在父组件中执行回调函数,从而实 ...

  9. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

最新文章

  1. C# Sato CL4NX打印机发送SBPL指令打印表面信息、RFID芯片数据写入
  2. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
  3. 手机App扫描多个网站显示的二维码的数据结构设计
  4. 正则表达式匹配中文字符串的文章URL
  5. vue element-ui级联选择器选中后下拉框自动收起
  6. Node.js 模块之Nimble流程控制
  7. xposed学习四:总结
  8. 6G尚处于早期研究阶段,长足发展需要时间和耐心
  9. js 生成二维码并点击下载
  10. 《未来世界的幸存者》后感
  11. 单片机学习笔记(数码管)
  12. 斐尔可(FILCO)67键迷你机械键盘 如何使用快捷键
  13. 基于spss的多元线性回归(逐步回归法 stepwise regression)
  14. The bean ‘dataTokenMapper‘ could not be injected because it is a JDK dynamic
  15. 如果一份工作让你时常感到焦虑,你会不会立马辞职?
  16. 阿里巴巴Java成神之路-笔记(8)动态代理
  17. 第五集 插肩而过茶卡湖,朝发夕至格尔木
  18. IDEA HTTP Client (秒懂)
  19. leetcode 2022.04.10 招商银行专场竞赛 D.商店促销活动(dp)
  20. 数控开料机,数控开料机与数控雕刻机的区别

热门文章

  1. 13-5 15 xshell使用xftp pure-ftpd
  2. Android性能优化之内存篇
  3. 谷歌宣布关闭Google TV,由Android TV接任
  4. android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
  5. 炫酷实用 7款jQuery/HTML5图片应用
  6. VNC客户端连接MacOS时一闪而过的解决办法
  7. 恰当地利用中间结果集
  8. ORA-12899: value too large for column (actual: 27, maximum: 20)错误解决
  9. 使Docker容器拥有可被宿主机以外的机器直接访问的独立IP
  10. loopback接口、router ID详解