变量发生变化时是否会引发事件?

时间:2015-04-13 10:30:49

标签: c# variables events

我知道正确的行动方法是创建一个类,在所述类中创建一个事件,然后在程序的另一部分中使用所述类,其中变量将被更改(例如,在等号中使用所述类)计算器,以便事件处理程序知道变量因为事件将被触发而被更改。但是,尝试简化我的代码,我正在寻找一种方法来直接监视变量而不需要无限循环/计时器,并在它发生变化时引发事件。有这样的事吗?如果没有,除了我提到的那个之外还有其他替代方案吗?

以下是我要提及的内容:

更改变量的代码 - >观察变化的另一段代码(不是循环)如果有变化则抛出一个事件 - >事件处理程序

2 个答案:

答案 0 :(得分:1)

你不能用字段来做,但有属性:

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...
    }
}

答案 1 :(得分:1)

虽然我知道在Stack Overflow中这是一个经常不受欢迎的做法,但您可能会发现我的项目NMF表达式很有趣:http://nmfexpressions.codeplex.com/

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

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

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

但是,这仅适用于非常强大的假设,例如您正在使用的所有对象模型完全支持INotifyPropertyChangedINotifyCollectionChanged