繁体   English   中英

变量更改时会引发事件吗?

[英]Is there an event that will raise when a variable has changed?

我知道正确的做法是创建一个类,在该类中创建一个事件,然后在要更改变量的程序的另一部分中使用该类(例如,在计算器的相等按钮中使用该类,以便事件处理程序知道变量已更改,因为将触发事件)。 但是,为了简化代码,我正在寻找一种方法来直接监视变量而没有无限循环/计时器并在更改时引发事件。 有这样的事吗? 如果没有,我提到的替代品是否还有其他替代品?

这是我要提及的内容:

更改变量的代码->另一段代码(不是循环)监视更改,然后在发生更改时引发事件->事件处理程序

您不能使用字段而是使用属性来做到这一点:

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged(); }
    }

    private void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}

编辑(.net 4.0)

class SomeClass : INotifyPropertyChanged
{
    private string someProperty;
    public string SomeProperty 
    {
        get { return someProperty; }
        set { someProperty = value; OnPropertyChanged("SomeProperty"); }
    }

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};
}

编辑(Winforms示例)

public partial class Form1 : Form
{
    private SomeClass theObject = new SomeClass(); //keep a reference of the object.

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
       //here we do the binding... we want the 'Text' Property of the control to change if the 'SomeProperty' changes OnPropertyChanged
        textBox1.DataBindings.Add("Text",theObject,"SomeProperty",false,DataSourceUpdateMode.OnPropertyChanged);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        theObject.SomeProperty = "This works!"; //just a test button that changes the property...
    }
}

尽管我知道这是Stack Overflow上通常不希望的做法,但您可能会发现我的项目NMF表达式很有趣: http : //nmfexpressions.codeplex.com/

基本上,该项目旨在允许您编写如下内容:

var myObservedVariable = Observable.Expression(() => whatever you want)

在这种情况下, myObservedVariable将是提供ValueChanged事件的INotifyValue<T> 或者,您可以使用查询语法。 另外,您可以看看其他类似的框架,例如Obtics ,BindableLINQ或ContinuousLINQ 后者的比较是在Bindable Linq和Continuous Linq中进行的

但是,这仅在相当强的假设下才起作用,例如您正在使用的所有对象模型完全支持INotifyPropertyChangedINotifyCollectionChanged

除了@Florian的答案外,您还可以在编译时使用Fody.PropertyChanged注入INotifyPropertyChanged接口的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM