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

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

测试结果:

测试完成

C#实现某一属性值变化时触发事件的更多相关文章

  1. DataGridView中DataGridViewComboBoxColumn的一些相关应用(一)让其值改变时触发事件-转

    转自  https://maodaili.de/mao.php?u=a%2FMrbEvUE8PnCuc7FrhJi0Rqd3kmOBHPZUbcJ1c2hbJUK0RYWpAf4lhIOddItP%2 ...

  2. javascript鼠标双击时触发事件大全

    javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...

  3. 前端组件化Polymer入门教程(6)——监听属性值变化

    监听属性值变化 如果需要监听属性值变化可以通过给observer赋值一个回调函数. <say-Hello></say-Hello> <dom-module id=&quo ...

  4. qt之窗口换肤(一个qss的坑:当类属性发现变化时需要重置qss,使用rcc资源文件)

    1.相关文章 Qt 资源系统qt的moc,uic,rcc命令的使用 2.概要    毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08.10.13等开发工具,并安装了qt的插件,最近在做客户 ...

  5. jquery chosen onchange 值改变时触发方法

    jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...

  6. input 内容发生改变时触发事件

    oninput,onpropertychange,onchange的用法 onchange触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本触发无效) b)当前对象失 ...

  7. target属性用于返回最初触发事件的DOM元素。

    target属性用于返回最初触发事件的DOM元素. 在HTML文档中,我们为<p>元素绑定点击事件("click"),由于DOM元素的事件冒泡机制,我们点击<p& ...

  8. WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...

  9. swift 属性值变化

    如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使有属性被声明为变量也不行. 这种行为是由于结构体(struct)属于值类型.当值类型的实例被声明为常量的时候,它的所有属 ...

随机推荐

  1. Android 调试桥(adb)是多种用途的工具

    Android 调试桥 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理 ...

  2. Kinect 开发驱动配置

    有几种配置方案 1.openNI+SensorKinect+PCL 的开发环境(pcl 标配) http://blog.csdn.net/chenxin_130/article/details/669 ...

  3. iOS学习总结之ARC和非ARC的单例模式实现

    iOS单例模式的实现 首先我们要明白下面三个问题: 什么是单例模式 单例模式的优点 如何实现单例模式 1.什么是单例模式 单例模式(Singleton):单例模式确保对于一个给定的类只有一个实例存在, ...

  4. Mono.Cecil - 0.6

    原文:Mono.Cecil - 0.6 项目地址:Mono.Cecil 项目描述:In simple English, with Cecil, you can load existing manage ...

  5. Ubuntu 搭建 GitLab 笔记

    简介 GitLab 社区版可以提供许多与 GitHub 相同的功能,且部署在属于自己的机器上,我们会因为网络及其他一些问题而不便使用 GitHub ,这时部署一个 GitLab 是最好的选择. 下载 ...

  6. Android零基础入门第35节:Android中基于回调的事件处理

    原文:Android零基础入门第35节:Android中基于回调的事件处理 通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理. 一. ...

  7. 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序。

    原文 如果您想确保Windows 10在新用户登录时不安装内置应用程序,则必须删除所有配置的应用程序. 本文的内容 已安装与配置的应用程序 删除配置的应用程序 安装与配置的应用程序^ 在介绍如何删除所 ...

  8. 解析 Qt 字库移植并能显示中文 (上篇)

    原文http://mobile.51cto.com/symbian-272552.htm 本文介绍的是Qt 字库移植并能显示中文,需要的字体库文件,一般是多个.具体移植那一个,看你使用的字库是什么了, ...

  9. delphi中pos和Ansipos函数的区别

    POS和ANSIPOS的主要区别在于,POS参数多用于是一个字符,而ANSIPOS多用于是多个字符: 例如:i:=pos('a','sssssas'); i:=ansipos('abc','sdabc ...

  10. IT安全军火库-转

    全球有260万信息安全专业人士,渗透测试工具是他们“安全军火库”中最常使用的装备,但直到最近,可用的渗透测试工具才丰富起来,但这也带来一个问题,挑选合适的渗透测试工具成了一件麻烦事,一个最简单的方法就 ...