使事件修改另一个对象

时间:2012-02-01 13:06:59

标签: c# events xna

我有一个班级MyClassab的实例。 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时,它会将内容输出到控制台。

1 个答案:

答案 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"; 
}