我是活动编程的新手,我显然误解了我想要做的事情。
我有一个Windows窗体应用程序,可以订阅来自另一个类的事件。 Ť
//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窗体代码我首先在类Value
中设置变量Foo
,然后再触发将执行上面OnEventFired
中的代码的事件。
我所看到的是,当在事件处理程序中使用时,变量Value
不包含在事件被触发之前设置的值(Value
为null)。
我知道我可以扩展EventArgs
以包含变量数据,但我试图理解为什么我正在做的事情不起作用。
答案 0 :(得分:6)
这是一个有效的简短示例。将其与您的代码进行比较,以找出问题所在。
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);
}
}
我的猜测是你使用Foo
的不同实例而不是你设置Value
的实例来连接事件处理程序。例如,像这样:
Foo foo = new Foo { Value = "Done" };
...
// Different instance of Foo!
button.Click += new Foo().HandleClick;
...但是如果不再看到任何代码就很难分辨。
答案 1 :(得分:2)
您无法访问变量Value
的唯一原因是
Value
未设置- 您正在将
醇>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;
}
}