使用不在当前上下文中的事件处理程序

时间:2009-08-26 09:09:00

标签: c# events event-handling

是否可以在控件(例如链接按钮)上设置与控件创建不在同一上下文中的事件处理程序?

例如,我有一个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;
    }
}

此致 も

4 个答案:

答案 0 :(得分:1)

让您的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);

如果您使用多个线程,请确保在Class1中的事件处理程序的代码中使用InvokeRequired和BeginInvoke / Invoke方法。

答案 1 :(得分:0)

修改darin的代码:

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

    public EventHandler()
    {
        //DoStuff
    }
}

public class Class2
{
    public Control control;
}

答案 2 :(得分:0)

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;
    }
}

答案 3 :(得分:0)

对于像这样的大多数通信,我已经不再喜欢在C#中使用直接事件了。我更喜欢一种更加分离的通信模式,比如“Event Aggregator”,它比传统的事件挂钩有很多好处。它们包括:

  • 减少耦合(Class1和Class2 不需要彼此了解)
  • 减少事件风暴
  • 弱连接(如果你没有内存泄漏 忘了断开连接)
  • 过滤