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

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

    1.NSSet 1.是一个无序的,管理多个对象的集合类,最大特点 是集合中不允许出现重复对象,和数学上的集合含义是一 样的 2.除了无序.不许重复之外,其它功能和NSArray是一样的 2.NSArr ...

  2. Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌

    原文:Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌 通过前两期的学习,我们可以正确搭建好Android Studio的开发环境,也创建了HelloWorld工程 ...

  3. C# ToolStrip在父窗体失去焦点时,点击里面的按钮无效

    C#里面ToolStrip控件,在父窗体失去焦点的情况下,第一次点击ToolStrip上面的按钮,只是让父窗体获得焦点,并不会引发按钮的Click事件.要执行按钮操作必须再点击一次.相当于说,在父窗体 ...

  4. Qt5下OpenGL程序的新写法

    在Qt5中,引入了QOpenGL*系列类,以取代Qt4时代的QGL*系列类. 下面是从Qt5例子中抠出的两种OpenGL程序模板,方便参考. 第一种写法: #ifndef TRIANGLEWINDOW ...

  5. QT5 屏幕旋转90度

    主要思路是将所有项目界面加载到QGraphicsScene,再进行旋转操作.直接上代码#include <QApplication>#include <QGraphicsView&g ...

  6. Impala概念与架构

    Impala概念与架构 下面的内容介绍Cloudera Impala的背景资料及特性,以便你更高效的使用它.Where appropriate, the explanations include co ...

  7. C语言实现常用排序算法——插入排序

    插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历:内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历:当发现有大于待插入元素的元素,则 ...

  8. Docker最全教程之使用Node.js搭建团队技术文档站(二十三)

    前言 各种编程语言均有其优势和生态,有兴趣的朋友完全可以涉猎多门语言.在平常的工作之中,也可以尝试选择相对适合的编程语言来完成相关的工作. 在团队技术文档站搭建这块,笔者尝试了许多框架,最终还是选择了 ...

  9. PHP实现WebService服务

    第一步,安装PHP扩展SOAP并开启扩展,是否开启成功以phpinfo为准. 第二步,创建服务端文件server.php <?php Class server { public function ...

  10. git实战经验(很实用)

    推荐学习git很好的网站https://www.breakyizhan.com/git/216.html 以下内容,虽然编排不行,但是请认真的读下去,都是自己平时请自操作的,放心使用. 这是个人的gi ...