C#改变变量触发事件

转自:http://blog.csdn.net/qyc898/article/details/5740592

在实际应用中,很多时候都要做监视机制。最常见的比如一个按钮的Chick方法。在VS2005中,控件的监视已经帮我们定义好了,我们只需要在方法里面写代码就可以。但是如果碰到某个变量,需要监视呢?

 

首先来初始化一个最简单的变量 

    private int myValue=0;

    public int MyValue
    {
        
get { return myValue; }
        
set 
        {
            
//如果赋的值与原值不同
            if (value!=myValue)
            {

            //就触发该事件!
                WhenMyValueChange();
            }

            //然后赋值!
            myValue 
= value; 
        }
    }

 

    //触发事件

    private void WhenMyValueChange()
    {
             ???
    }

看到这里可能你觉得已经可以了,但其实不是这样的。这样写,只有等这个触发事件执行完毕后才会给myValue赋值。这就意味着你在执行这个触发事件时,会发现原来变量还没有变,这就会导致意想不到的错误。所以不能直接在WhenMyValueChange()写动作,而是应该利用它来触发另一个方法,而这个方法会独立进行,不会影响到myValue的赋值。这就是真正意义上的变量值改变时触发了。

 

 

现在我再定义一个方法体:


    //变量改变后触发
    private void afterMyValueChanged()
    {

        
//do something

    }

 

那么怎么用WhenMyValueChange()去触发afterMyValueChanged(),并且让afterMyValueChanged()独立进行呢?

    //定义一个委托
    public delegate void MyValueChanged(object sender, EventArgs e);
    
//与委托相关联的事件
    public event MyValueChanged OnMyValueChanged;

    //将afterMyValueChanged的委托绑定到事件上

    OnMyValueChanged += new MyValueChanged(afterMyValueChanged);


 

 

//在刚才的WhenMyValueChange中,触发该事件

    private void WhenMyValueChange()
    {
             if (OnMyValueChanged != null)

        {

            OnMyValueChanged(thisnull);

        }

    }


C#中,直接给变量赋值并不会自动触发事件。不过你可以通过一些设计模式和技巧来实现类似的效果,比如使用属性(Properties)、INotifyPropertyChanged 接口或依赖项系统等。 ### 使用属性 + INotifyPropertyChanged 这是WPF、UWP以及MVVM框架中最常见的做法之一: ```csharp using System.ComponentModel; using System.Runtime.CompilerServices; public class MyViewModel : INotifyPropertyChanged { private string myVar; public event PropertyChangedEventHandler PropertyChanged; // 定义一个公共属性,并在此处处理变化通知 public string MyProperty { get { return myVar; } set { if (myVar != value) { myVar = value; OnPropertyChanged(); } } } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 在这个例子中,每当`MyProperty`被设置新值时,都会调用 `OnPropertyChanged()` 方法并发送更改通知,订阅者可以监听到这个事件的发生而做出响应。 这种机制对于构建用户界面特别有用,在数据绑定场景下能够确保UI实时反映最新的状态变更信息。 ### 其它方法 除了上述方式外,还有其他几种途径可以在数值发生变化的时候触发特定动作: 1. **自定义逻辑控制:** 将对变量的操作封装在一个函数内部完成,在其中加入必要的检查和回调; 2. **委托 / 回调:** 利用Delegate创建一种观察者的功能当目标对象发生变动时立即反馈给所有注册过的客户端; 3. **第三方库** 或者 .NET Core 新特性如 Source Generators 来简化此过程; 每种解决方案都有各自的优缺点,请根据实际应用场景选择最合适的方式!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值