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的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后 ...
随机推荐
- Apache Shiro 721反序列化漏洞复现
目录 漏洞原理 复现 修复方式 漏洞原理 Shiro 的RememberMe Cookie使用的是 AES-128-CBC 模式加密.其中 128 表示密钥长度为128位,CBC 代表Cipher B ...
- XSS跨站脚本之portswigger labs练习
目录 1 什么是XSS 2 XSS的类型有哪些 3 XSS攻击的过程和原理 4 XSS的防御 5 可能会用到的XSS Payload资源 6 靶场训练 portswigger labs 6.1 没有任 ...
- bootstrapTable初始化常用参数
bootstrapTable初始化常用参数,前端分页排序,后端获取表格数据 $('#table').bootstrapTable({ toolbar: '#mybar', //工具按钮用哪个容器 st ...
- (Python基础教程之十九)Python优先级队列示例
1.什么是优先队列 优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素还具有与之关联的"优先级". 在优先级队列中,优先级高的元素先于优先级低的元素提供. 如果 ...
- python开发包之远程隧道链接sshtunnel
缘起: 公司很多的数据库的链接都是本地连接或者指定ip地址可以访问, 如果你没有该ip权限, 但是你可以登录该数据库所在的服务器, 这个时候就可以使用ssh链接上这个服务器,以此为跳板进行数据库的链接 ...
- Linux之查看开放端口
在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等等 ...
- ThreeJs-05纹理材质高级操作
1.纹理操作 1.1 重复.旋转.位移.缩放 重复 但是要在水平方向上重复,还得允许 按照刚才的重复方式 如果设置为镜像重复 位移 旋转 1.2 翻转与alpha生成颜色 正常的图 不翻转默认是翻转的 ...
- AI工具推荐——Cherry Studio
Cherry Studio介绍 Cherry Studio是一款支持多模型服务的 Windows/macOS GPT 客户端. 它的主要特点如下: 多样化的大型语言模型提供商支持 ️ 主要的大型语言模 ...
- 2024 盘古石数据取证 服务器部分wp
1. 分析内部IM服务器检材,在搭建的内部即时通讯平台中,客户端与服务器的通讯端口是:[答案格式:8888][★☆☆☆☆] 8065 2. 分析内部IM服务器检材,该内部IM平台使用的数据库版本是: ...
- django admin 后台管理 新手学习步骤记录 (2)
学习使用django admin后台管理. 参考.Django基础之Admin后台数据管理_django admin_马航行的博客-CSDN博客