C#实现某一属性值变化时触发事件
在我们做工业软件中,经常会遇到要实时监控某一点,在这个点变化时去做一些事情
放入程序里呢,就是要实时监控某一属性的值,当值发生变化时触发事件,其核心就是借助属性的set方法,来判断当前set的值是否与原来的值相等,如果相等直接赋值不予理会,如果不相等,说明值变了,根据自己调用的方法,声明委托,事件,触发方法
核心代码:
public delegate void tempchange(object sender,eventargs e); public event tempchange ontempchange; private string _temp; public string temp { get { return _temp; } set { if (_temp!=value &&_temp !=null) { ontempchange(new object(), new eventargs()); } _temp= value;
}
}
下边我们做一个demo ,来测试一下
我们新建一个from,上边添加一个lable,添加一个button 我们通过button来改变这个temp属性的值 ,使之触发对应的事件
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.threading.tasks; using system.windows.forms; namespace windowsformsapplication3 { public partial class form1 : form { public form1() { initializecomponent(); } int i = 0; private void form1_load(object sender, eventargs e) { changeevent += form1_changeevent; } void form1_changeevent(string value) { this.richtextbox1.invoke(new action(() => { this.richtextbox1.appendtext("当前lable的值为" + value+"\r\n"); })); } private void button1_click(object sender, eventargs e) { temp = i + ""; label1.text = temp; i++; } public delegate void changedelegate(string value); public event changedelegate changeevent; public string _temp; public string temp { get { return _temp; } set { if (_temp != value) { changeevent(value); } _temp = value; } } } }
测试:
可以看到 我们每点击一次按钮 都改变了temp的值,从而触发了changeevent事件 ------给richtextbox添加文本
===================================================================================================
分割线
===================================================================================================
郑重声明:感谢id为 特别 的前辈提醒
其实微软给我们提供了inotifypropertychanged接口用于通知客户端,通常绑定客户端,在属性值已更改。
微软提供了如何:实现 inotifypropertychanged 接口 的文档,各位看官如有兴趣可以先去看一下官方的文档,毕竟我写的肯定简陋
接下来我根据文档自己写一个demo测试一下
还是和上边一样我们新建一个from,上边添加一个lable,添加一个button 我们通过button来改变这个temp属性的值 ,使之触发对应的事件
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.runtime.compilerservices; using system.text; using system.threading.tasks; using system.windows.forms; namespace windowsformsapplication3 { public partial class form2 : form { public form2() { initializecomponent(); } demo demo = new demo(); private void form2_load(object sender, eventargs e) { //给changed事件注册方法 demo.propertychanged += demo_propertychanged; } void demo_propertychanged(object sender, propertychangedeventargs e) { setmsg(e.propertyname); } private void button1_click(object sender, eventargs e) { //通过点击事件,将当前时间的值赋给temp 从而触发属性改变事件 demo.temp = datetime.now.tostring(); } private void setmsg(string msg) { //向richtextbox中添加文本 this.richtextbox1.invoke(new action(() => {this.richtextbox1.appendtext(msg+"\r\n"); })); } } public class demo : inotifypropertychanged { //实现inotifypropertychanged public event propertychangedeventhandler propertychanged; //此方法由每个属性的set访问者调用。 //应用于可选propertyname的callermembername属性 //参数导致调用者的属性名称被替换为参数。 private void propchanged([callermembername] string propertyname = "") { if (propertychanged != null) { propertychanged(this, new propertychangedeventargs(propertyname)); } } //定义属性 private string _temp; public string temp { get { return _temp; } set { if (this._temp != value) { propchanged(value); this._temp = value; } } } } }
测试结果:
测试完成