触发事件后的类变量可用性



我是事件编程的新手,我显然误解了我正在尝试做的事情。

我有一个 Windows 窗体应用程序,它订阅来自另一个类的事件。 T

//Class that provides event handler to Windows Forms application.
class Foo
{
  public string Value{get; set;}
  // Lots of other code
  public void OnEventFired(object sender, EventArgs e)
  {
     // Attempt to access variable Value here.
  }    
}

在 Windows 窗体代码中,我首先在类 Foo 中设置变量Value,然后再触发将执行上述OnEventFired代码的事件。

我所看到的是,在事件处理程序中使用时,变量Value不包含在触发事件之前设置的值(Value为空)。

我知道我可以扩展EventArgs以包含变量数据,但我试图理解为什么我正在做的事情不起作用。

这是一个简短的例子。将此与您的代码进行比较以找出问题所在。

using System;
using System.Windows.Forms;
class Foo
{
    public string Value { get; set; }
    public void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).Text = Value;
    }
}
class Program
{
    public static void Main()
    {
        Foo foo = new Foo { Value = "Done" };
        Button button = new Button { Text = "Click me!" };
        button.Click += foo.HandleClick;
        Form form = new Form
        {
            Controls = { button }
        };
        Application.Run(form);
    }
}

我的猜测是,您使用了与您设置Value不同的Foo实例来挂接事件处理程序。例如,像这样:

Foo foo = new Foo { Value = "Done" };           
...
// Different instance of Foo!
button.Click += new Foo().HandleClick;

。但是,如果不看到更多的代码,就很难分辨。

无法访问变量Value的唯一原因是

  1. 未设置Value
  2. 您将event绑定到其他实例,而不是设置了Value的实例。

最好的方法是在构造函数中获取Value,以便保证设置Value

class Foo
{
    public string Value { get; set; }
    public Foo(Value value)
    {
    }
    public void HandleClick(object sender, EventArgs e)
    {
        ((Control)sender).Text = Value;
    }
} 

最新更新