Использование обработчиков событий, которые не в текущем контексте - PullRequest
1 голос
/ 26 августа 2009

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

Например, у меня есть экземпляр Class1, который создает Class2, элемент управления создается в Class2, но мне нужен обработчик событий, чтобы быть в Class1.

Псевдокод:

public class Class1
{
    public Class1()
    {
        Class2 MyClass2 = new Class2();
        MyClass2.DoSomething();
    }

    public void EventHandler()
    {
        // Handle the event
    }
}

public class Class2
{
    public void DoSomething()
    {
        SomeControl control = new SomeControl();
        control.SomeEvent += parent.EventHandler;
    }
}

С уважением Moo

Ответы [ 4 ]

1 голос
/ 26 августа 2009

Попросите вашего Class2 выставить пользовательское публичное событие. Это событие срабатывает при срабатывании управляющего события.

// In Class2

    public event EventHandler<EventArgs<T>> ControlClickedEvent = null;

    protected void OnControlClickedEvent()
    {
        if (ControlClickedEvent != null)
        {
            ControlClickedEvent(this, new EventArgs());  
        }
    }

  ...

   private void cmdButton_Click(object sender, EventArgs e)
   {
        OnControlClickedEvent();
   }

Тогда ваш Class1 подписывается на это событие. «Обработчик событий» является частью Class1.

// In Class1
MyClass2.ControlClickedEvent += new EventHandler<EventArgs<ControlClickedEvent>>(EventHandler);

Если вы используете несколько потоков, убедитесь, что вы используете методы InvokeRequired и BeginInvoke / Invoke в коде обработчика событий в Class1.

0 голосов
/ 26 августа 2009

Я больше не пользуюсь прямыми событиями в C # в эти дни для большей части общения, подобного этому. Я предпочитаю более разъединенный шаблон связи, такой как « Event Aggregator », который имеет много преимуществ по сравнению с традиционным перехватом событий. Они включают в себя:

  • Пониженное сцепление (Class1 и Class2 не нужно знать друг о друге)
  • Уменьшенные штормы событий
  • Слабые соединения (нет утечек памяти, если вы забудь отключить)
  • Фильтрация
0 голосов
/ 26 августа 2009
public class Class1 
{
    public Class1()
    {
        new Class2().CreateControl(EventHandler);
    }

    public void EventHandler() {}
}

public class Class2
{
    public void CreateControl(Action eventHandler)
    {
        SomeControl control = new SomeControl();
        control.SomeEvent += eventHandler;
    }
}
0 голосов
/ 26 августа 2009

Изменение кода Дарина:

public class Class1 
{
    public Class1()
    {
        Class2 class2 = new Class2();
        class2.Control.SomeEvent += this.EventHandler;
    }

    public EventHandler()
    {
        //DoStuff
    }
}

public class Class2
{
    public Control control;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...