假设我在一个自定义控件中定义了一些自定义事件myEvent。现在,在举办活动时,此活动将由父级表单捕获。Winform自定义控件如何通知另一个Winform自定义控件?
如何在另一个自定义控件中捕获此事件,该控件位于同一父表单上?我希望另一个控件以某种方式订阅第一个控件事件。
假设我在一个自定义控件中定义了一些自定义事件myEvent。现在,在举办活动时,此活动将由父级表单捕获。Winform自定义控件如何通知另一个Winform自定义控件?
如何在另一个自定义控件中捕获此事件,该控件位于同一父表单上?我希望另一个控件以某种方式订阅第一个控件事件。
我在处理MVC时遇到过类似的情况。我喜欢处理它的方式是在控制器中使用中介器设计模式。
基本上,你有一个具有注册功能和通知功能的类。注册函数采用实现侦听器接口和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
}
}
行现在通常我有一个基本的控制器,它实现了一个静态的调解对象。然后我所有的其他控制器继承它。如果您使用的是代码并且无法继承,那么您可以尝试使用单例模式。 .Net静态类也非常棒,因为它们有一个构造函数,所以你也可以使用它。所以在你的情况下,我会为每个控件实现IListener后面的代码,然后在每个控件的构造函数中,有像Mediator.GetInstance()。Register(this,Messages.MyEvent)这样的东西。这是一种快速和肮脏的方式,可以在未来重构一下,使它更具可重用性。
从快速谷歌搜索一些资源
http://www.avajava.com/tutorials/lessons/mediator-pattern.html
http://sourcemaking.com/design_patterns/mediator
好运
您可以使用事件处理和代表为和你的接收器控制订阅间接您发送器控制的事件,VIA两个控件的父控件,充当多路复用器。
答案很简单。用正确的签名以第二种形式(没有事件的形式)声明方法并将其标记为公共。
在父窗体中将第二个窗体的方法分配给第一个窗体的事件。
是刚刚发布,并引发一个事件,并从你的听众控制订阅。