我发现articles关于和solutions这个与Prism有关的问题,但我找不到任何与Caliburn Micro相关的内容。我检查了标有Caliburn.Micro
和EventAggregator
标签的所有问题,但没有找到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>>
类来发送和接收“空”事件。 (当然这是一个有限的解决方案,因为组件只能以这种方式发送一个事件。)
我怀疑这个解决方案是原始的(好吧,我们只是把它称之为事实),并且我有一些更好的东西可以忽略。
答案 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;
}
}
}