欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现某一属性值变化时触发事件

程序员文章站 2022-06-24 11:05:25
在我们做工业软件中,经常会遇到要实时监控某一点,在这个点变化时去做一些事情 放入程序里呢,就是要实时监控某一属性的值,当值发生变化时触发事件,其核心就是借助属性的Set方法,来判断当前set的值是否与原来的值相等,如果相等直接赋值不予理会,如果不相等,说明值变了,根据自己调用的方法,声明委托,事件, ......

在我们做工业软件中,经常会遇到要实时监控某一点,在这个点变化时去做一些事情

放入程序里呢,就是要实时监控某一属性的值,当值发生变化时触发事件,其核心就是借助属性的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;
            }
        }
    }
}

测试:

C#实现某一属性值变化时触发事件

可以看到 我们每点击一次按钮 都改变了temp的值,从而触发了changeevent事件 ------给richtextbox添加文本

===================================================================================================

分割线

===================================================================================================

郑重声明:感谢id为 特别 的前辈提醒

其实微软给我们提供了inotifypropertychanged接口用于通知客户端,通常绑定客户端,在属性值已更改。

C#实现某一属性值变化时触发事件

 

微软提供了如何:实现 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;
                }

            }
        }
    }

}

测试结果:

C#实现某一属性值变化时触发事件

测试完成