是否可以在控件(例如链接按钮)上设置与控件创建不在同一上下文中的事件处理程序?
例如,我有一个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;
}
}
此致 も
答案 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”,它比传统的事件挂钩有很多好处。它们包括: