Сделайте событие изменить другой объект - PullRequest
1 голос
/ 01 февраля 2012

У меня есть экземпляры класса 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 s Text было бы "Foo", но если сработало событие b Selected, оно a 'Text станет "Баром".

Я пытался реализовать что-то похожее на вышеописанное, но это не сработало. (VS2010 утверждал, что MyEvent(a) - это событие с нулевым аргументом, хотя я не понимаю, почему a является нулевым.)

Я не очень хорошо понимаю события (я пытаюсь их изучить), поэтому извините, если это очевидно.

ПОДРОБНОСТИ:

На практике я использую LabelSelectable, а не MyClass. LabelSelectable extends Control, который является классом для отображения различных вещей, таких как картинки, кнопки и метки на экране (это XNA, если это уместно). По сути, в этом случае набор этих выбираемых меток можно циклически прокручивать стрелками, и если вы нажмете Enter, когда на данной метке произойдет событие Selected.

На самом деле я следовал этому уроку, и вы можете найти там детали реализации. (Я не хочу быть бесполезным, но я не уверен, какие именно части важны, а какие нет, и если бы я все здесь изложил, было бы много кода.)

Насколько я вижу, "MyClass" выглядит примерно так:

MyClass 
{
    public event EventHandler Selected;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }

    void OnSelected(EventArgs e)
    {
        if (Selected != null)
        {
            Selected(this, e);
        }
    }
}

Я могу заставить работать код, приведенный ниже, кстати:

void MainMethod() 
{
    var a = new MyClass();
    a.Text = "Foo";

    var b = new MyClass();
    b.Selected += MyEvent; // Make the event fire when b is "selected"
}

void MyEvent(object sender, EventArgs e) {
    Console.WriteLine("Event fired!");
}

Она выводит данные на консоль, когда выбрано b.

1 Ответ

1 голос
/ 01 февраля 2012

Вы не должны размещать параметры в объявлении обработчика событий.

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"; 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...