如何使用Caliburn Micro的EventAggregator发送空事件(无有效载荷)?

时间:2017-04-06 14:28:07

标签: c# caliburn.micro eventaggregator

我发现articles关于和solutions这个与Prism有关的问题,但我找不到任何与Caliburn Micro相关的内容。我检查了标有Caliburn.MicroEventAggregator标签的所有问题,但没有找到Caliburn对这个看似基本问题的具体说明。

场景:我希望将事件发布到EventAggregator,但没有任何信息,除了发出信号之外的事件。

问题:首先,在Caliburn Micro中,EventAggregator的{​​{1}}方法需要发送类型的实例。其次,订阅和处理事件需要实现Publish()接口,其中IHandle<T>是我们想要接收的实例类型。似乎这完全是围绕发布和处理实际数据而设计的。

目标:能够发布简单事件而无需创建和实例化多个空/虚拟类,并且无需T不必要的事件,我需要使用条件进一步过滤

到目前为止我的解决方案

这是我想要改进/替换的。 (显然,这个解决方案存在问题,因为它会在具体类周围创建更紧密的耦合,但在我的用例中这不是一个大问题,因为它是一个针对给定事件具有单一发布组件的小项目,而EventAggregator用于其他实际目标。)

我创建了一个实现单例模式的通用Handle()类,通过Signal<T>属性提供了自身的静态实例:

Instance

所以我可以通过以下方式发布事件(public class Signal<T> { public static readonly Signal<T> Instance = new Signal<T>(); private Signal() { } } 就是一个例子):

SignalSourceClass

通过以下列方式声明_eventAggregator.PublishOnUIThread(Signal<SignalSourceClass>.Instance); 的实现来处理事件:

IHandle<T>

这样我就可以通过仅创建这个IHandle<Signal<SignalSourceClass>> 类来发送和接收“空”事件。 (当然这是一个有限的解决方案,因为组件只能以这种方式发送一个事件。)

我怀疑这个解决方案是原始的(好吧,我们只是把它称之为事实),并且我有一些更好的东西可以忽略。

1 个答案:

答案 0 :(得分:2)

只需创建一个包含所需信号的枚举:

public enum ProjectSignals
{
    Connected,
    Disconnected,
    Openned
}

然后只是

_eventAggregator.PublishOnUIThread( ProjectSignals.Connected );

class SomeClass : IHandle<ProjectSignals>
{
   public void Handle( ProjectSignals signal )
   {
        switch (signal)
        {
            case Connected:
                break;
        }
    }
}