C# Winform 实现静态变量属性的值变了,触发事件,类似WPF的双向绑定
在C# WinForms中,虽然没有像WPF那样内置的双向绑定机制,但你可以通过事件和属性封装来实现类似的功能。具体来说,你可以在静态属性的set访问器中触发一个自定义事件,然后在需要的地方订阅这个事件,以便在属性值发生变化时执行相应的操作。
以下是一个简单的示例,展示了如何实现这一功能:
using System;
using System.Windows.Forms;
public static class MyStaticClass
{
// 定义事件
public static event EventHandler<EventArgs> MyPropertyChanged;
private static string _myProperty;
public static string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
_myProperty = value;
// 触发事件
OnMyPropertyChanged();
}
}
}
// 触发事件的方法
private static void OnMyPropertyChanged()
{
MyPropertyChanged?.Invoke(null, EventArgs.Empty);
}
}
public class MyForm : Form
{
private Label myLabel;
public MyForm()
{
myLabel = new Label();
myLabel.Text = "Initial Value";
myLabel.Location = new System.Drawing.Point(10, 10);
this.Controls.Add(myLabel);
// 订阅事件
MyStaticClass.MyPropertyChanged += MyStaticClass_MyPropertyChanged;
}
// 事件处理程序
private void MyStaticClass_MyPropertyChanged(object sender, EventArgs e)
{
// 当属性值变化时,更新Label的文本
myLabel.Text = MyStaticClass.MyProperty;
}
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}
使用示例:
你可以在其他地方修改 MyStaticClass.MyProperty 的值,例如:
MyStaticClass.MyProperty = "New Value";
注意事项:
- 由于 MyProperty 是静态的,它的值在整个应用程序生命周期内是共享的。
- 如果你需要在多个窗体或控件之间共享状态,这种方法是有效的。
通过这种方式,你可以在WinForms中实现类似WPF的双向绑定效果。
这里使用的是 EventHandler<TEventArgs> 泛型委托,其中 TEventArgs 是 EventArgs 类型(或派生类型)。这种定义方式已经隐式地使用了委托,因此不需要显式地定义一个新的委托类型。
如果显式定义委托,好处是什么?
1. 自定义事件参数:
如果你需要传递更多信息(不仅仅是 sender 和 EventArgs),可以定义一个自定义的事件参数类,并为其定义一个专门的委托。
public class MyPropertyChangedEventArgs : EventArgs
{
public string OldValue { get; }
public string NewValue { get; }
public MyPropertyChangedEventArgs(string oldValue, string newValue)
{
OldValue = oldValue;
NewValue = newValue;
}
}
// 定义自定义委托
public delegate void MyPropertyChangedEventHandler(object sender, MyPropertyChangedEventArgs e);
// 使用自定义委托定义事件
public static event MyPropertyChangedEventHandler MyPropertyChanged;
这样,事件处理程序可以接收到更多信息(如旧值和新值)。
2. 提高代码可读性:
显式定义委托可以让代码更具可读性,尤其是当事件的用途非常明确时。
public delegate void MyPropertyChangedDelegate(string newValue);
public static event MyPropertyChangedDelegate MyPropertyChanged;
这种方式更直观地表达了事件的用途。
3.灵活性:
自定义委托可以定义更灵活的参数列表,而不仅限于 object sender, EventArgs e 的标准模式。
例如,你可以定义一个没有 sender 参数的事件:
public delegate void MyPropertyChangedDelegate(string newValue);
public static event MyPropertyChangedDelegate MyPropertyChanged;
显式定义委托
以下是显式定义委托的完整示例:
using System;
using System.Windows.Forms;
public static class MyStaticClass
{
// 定义自定义委托
public delegate void MyPropertyChangedDelegate(string newValue);
// 定义事件
public static event MyPropertyChangedDelegate MyPropertyChanged;
private static string _myProperty;
public static string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
string oldValue = _myProperty;
_myProperty = value;
// 触发事件
OnMyPropertyChanged(value);
}
}
}
// 触发事件的方法
private static void OnMyPropertyChanged(string newValue)
{
MyPropertyChanged?.Invoke(newValue);
}
}
public class MyForm : Form
{
private Label myLabel;
public MyForm()
{
myLabel = new Label();
myLabel.Text = "Initial Value";
myLabel.Location = new System.Drawing.Point(10, 10);
this.Controls.Add(myLabel);
// 订阅事件
MyStaticClass.MyPropertyChanged += MyStaticClass_MyPropertyChanged;
}
// 事件处理程序
private void MyStaticClass_MyPropertyChanged(string newValue)
{
// 当属性值变化时,更新Label的文本
myLabel.Text = newValue;
}
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}
总结
使用 EventHandler 的好处:
- 简单、标准化,适合大多数场景。
- 符合 .NET 的事件模式(object sender, EventArgs e)。
显式定义委托的好处:
- 更灵活,可以自定义参数列表。
- 提高代码可读性和表达力。
- 适合需要传递更多信息的场景。
在实际开发中,选择哪种方式取决于具体需求。如果只是简单的值变化通知,使用 EventHandler 就足够了;如果需要更复杂的事件参数或更高的灵活性,则可以显式定义委托。
C# Winform 实现静态变量属性的值变了,触发事件,类似WPF的双向绑定的更多相关文章
- C#实现某一属性值变化时触发事件
在我们做工业软件中,经常会遇到要实时监控某一点,在这个点变化时去做一些事情 放入程序里呢,就是要实时监控某一属性的值,当值发生变化时触发事件,其核心就是借助属性的Set方法,来判断当前set的值是否与 ...
- DataGridView中DataGridViewComboBoxColumn的一些相关应用(一)让其值改变时触发事件-转
转自 https://maodaili.de/mao.php?u=a%2FMrbEvUE8PnCuc7FrhJi0Rqd3kmOBHPZUbcJ1c2hbJUK0RYWpAf4lhIOddItP%2 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- Vu3.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定
观前须知:本人演示使用的input是自己手敲的,如果使用的是element-ui等表单组建的input框请选择性参考,不保证我的方法对你们也完全有效. 父组件代码: 这里我的MiniInput是以组件 ...
- Vue框架-03:JS的几种循环方式,Key值的解释,数组/对象的检测与更新,input事件,v-model数据双向绑定,过滤案例,事件修饰符,按键修饰符,表单控制
目录 前端开发之Vue框架 一.JS循环的几种方式 1.v-for可循环的变量 2.js的循环方式 二.Key值的解释 三.数组.对象的检测与更新 四.input事件 五.v-model双向数据绑定 ...
- 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到
定义和创建: TWinControl = class(TControl) private FBrush: TBrush; end; constructor TWinControl.Create(AOw ...
- Linux c readdir是非线程安全,需用readdir_r,要注意用静态变量当做返回值的函数的非线程安全性
readdir函数: struct dirent *readdir(DIR *dirp); The data returned by readdir() may be overwritten by ...
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- PHP---------PHP函数里面的static静态变量
工作一年了,一年里很少用到static这个关键词,不管是类里面还是方法里面基本都没怎么用过.平时看到类里面有这个都没什么好奇的,今天在函数里面看到了这个,就去百度了一下. <?phpfuncti ...
- Android中静态变量的生命周期
静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后 ...
随机推荐
- Java语言的动态性支持
一.脚本语言的支持 JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式.JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.scri ...
- webpack之基本使用
webpack是一个模块打包器(module bundler),webpack视HTML,JS,CSS,图片等文件都是一种 资源 ,每个资源文件都是一个模块(module)文件,webpack就是根据 ...
- onlyoffice
https://helpcenter.onlyoffice.com/installation/docs-enterprise-install-centos.aspx?_ga=2.51626159.76 ...
- Prime1_解法一:cms渗透 & 内核漏洞提权
Prime1_解法一:cms渗透 & 内核漏洞提权 目录 Prime1_解法一:cms渗透 & 内核漏洞提权 信息收集 主机发现 nmap扫描 tcp扫描 tcp详细扫描22,80端口 ...
- 网站动静加速架构 dcdn+ga 全站加速和全球加速api
背景: 1,公司服务全部在香港 2,所有的服务也都在香港 3,但是我们的客户都在国内 4,那么国内用户访问香港的服务 那么就会存在慢的问题 至于为什么不放到国内,因为我们公司是做nft的.所以你懂得. ...
- WxPython跨平台开发框架之参数配置管理界面的设计和实现
我曾经在2014年在随笔<Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建>介绍过基于.NET开发的参数配置管理界面,本篇随笔基于类似的效果 ...
- C# 学习笔记 0415
关于零碎的知识笔记总结,你可能需要知道的 一.Linq相关 Find()和First()与FirstOrDefault Find方法只能在List上使用,而后者能更广泛应用在IEnemerable上. ...
- nodejs版本控制器nvm安装及简单使用
介绍:nvm是node.js的版本管理器,可以安装和切换不同版本node.js 下载:https://github.com/coreybutler/nvm-windows/releases 官网下载: ...
- 【Python】【MySQL】Python将JSON数据以文本形式存放到MySQL的Text类型字段中
1.起因 在做一个自动打卡的玩意.登录会得到那个平台一系列的信息.我又不想专门修改.增加数据库字段来存放,所有打算直接将返回的JSON数据保存到一个MySQL字段中. 内容肯定不能直接放,考虑下比如数 ...
- IntelliJ IDEA 导入项目后出现非法字符解决方法
1.Ctrl+Alt+S进入设置页面如图,更改为UTF-8 2.Ctrl+Alt+S进入设置页面如图,在箭头所指的位置填上 -encoding UTF8 3.清除文件中的BOM特殊不可见字符 选择项目 ...