我有一个班级MyClass
,a
和b
的实例。 MyClass
有一个字段Text
。我想将事件MyEvent(MyClass target)
分配给b.Selected
,以便在触发时,此事件会修改a.Text
。我有一些看起来像这样的代码:
void MainMethod()
{
var a = new MyClass();
a.Text = "Foo";
var b = new MyClass();
b.Selected += MyEvent(a); // Make the event fire when b is "selected"
}
void MyEvent(MyClass target) {
target.Text = "Bar";
}
为了澄清,我的意图是a
的{{1}}将是“Foo”,但如果Text
的所选事件触发,则b
的{{1}} { {1}}将成为“Bar”。
我试图实现类似于上面的东西,但它没有用。 (VS2010声称a
是一个带有null参数的事件,即使我不知道为什么a为null。)
我不太了解事件(我正在努力学习它们),如果这很明显就很抱歉。
的详细信息:
实际上,我使用Text
而不是MyEvent(a)
。 LabelSelectable
扩展MyClass
,这是一个用于在屏幕上显示各种内容(如图片,按钮和标签)的类(如果相关,则为XNA)。基本上在这种情况下,可以使用箭头循环使用这些可选标签,如果在给定标签上按Enter键,则会触发LabelSelectable
事件。
我实际上是在学习本教程,您可以在那里找到实施的详细信息。 (我并不是说无益,但我不确定哪些部分是相关的,什么不是,如果我把所有内容放在这里,那将是很多代码。)
据我所知,“Control
”看起来像这样:
Selected
顺便说一下,我可以得到以下代码的等效代码:
MyClass
当选择b时,它会将内容输出到控制台。
答案 0 :(得分:1)
您不应该在事件处理程序声明中放置参数。
b.Selected += MyEvent(a); // Make the event fire when b is "selected"
应该只是
b.Selected += MyEvent; // Make the event fire when b is "selected"
MyClass应该负责将target的值传递给Selected的调用,或者你必须依赖MyEvent方法本身来确定要修改的对象。
遵循标准事件模式可能是冒险的,其中事件源作为参数传递给事件处理程序:
void MyEvent(object sender, EventArgs e) {
var source = sender as MyClass;
var target = /* do something here to find the target based on the sender */
target.Text = "Bar";
}