假设在自定义控件中我定义了一些自定义事件myEvent。现在,当提出事件时,父事件表格将捕获此事件。
如何在同一个父窗体上的另一个自定义控件中捕获此事件?我希望另一个控件以某种方式订阅第一个控件事件。
答案 0 :(得分:3)
在处理MVC时,我遇到了类似的情况。我喜欢处理它的方法是在控制器中使用中介设计模式。
基本上,你有一个具有寄存器功能和通知功能的类。 register函数接受一个实现侦听器接口和messageId的对象。它将这些存储在字典中。 notify函数为需要发送给侦听器的事件接收messageId,并通知相应的事件已发生。
所以也许就像
那样public interface IListener
{
void MessageRaised(int messageId, params object[] arguments);
}
public class Mediator
{
public void Register(IListener listener, int messageId)
{
//... add to dictionary of arrays for each messageId
}
public void NotifyListeners(int messageId, params object[] arguments)
{
//... loop through listeners for the messageId and call the MessageRaised function for each one
}
}
现在通常我有一个基本控制器,它实现了一个静态的Mediator对象。然后我的所有其他控制器继承它。如果您正在使用后面的代码并且无法继承,那么您可以尝试使用单例模式。 .Net静态类也很棒,因为它们有一个构造函数,所以你也可以使用它。
所以在你的情况下,我会为每个控件实现IListener提供代码,然后在每个控件的构造函数中,有一些像Mediator.GetInstance()。Register(this,Messages.MyEvent)。这是一种快速而肮脏的方式,可以在将来进行一些重构,使其更具可重用性。
快速谷歌搜索的一些资源
http://www.avajava.com/tutorials/lessons/mediator-pattern.html
祝你好运答案 1 :(得分:1)
您可以使用事件处理和委托,并让您的Receiver Control将间接订阅到您的Sender Control事件, VIA 两个控件的父控件,充当多路复用器。
答案 2 :(得分:0)
答案很简单。使用正确的签名声明第二种形式的方法(没有事件的方法)并将其标记为公共。
在父窗体中,将第二种窗体的方法指定给第一种窗体的事件。
答案 3 :(得分:0)
是的,只需发布并引发一个事件,并从您的侦听器控件订阅它。