如何在Caliburn Micro中为单个窗口使用多个IEventAggregator?

时间:2012-09-24 17:05:12

标签: c# .net wpf caliburn.micro

我有一个ShellWindow,它有一个IEventAggregator,我的孩子都发布到这个IEventAggregator?。

现在我有一个名为JIMSMessage的静态类,我将其发布到ShellViewModel的IEventAggregator。

public static class JIMSMessage
{
    public static bool Show(IEventAggregator _events, string message)
    {
        _events.Publish(new Message()
        {
            MessageValue = message
        });

        return true;
    }        
}

我希望Show方法的返回值来自ViewModel,后者调用此方法..

让我们说......

我有一个名为LedgerViewModel的ViewModel,它调用JIMSMessage.Show,如下所示,

JIMSMessage.Show(_events,"Enter Ledger Name.");

它的工作,但我的MessageWindowViewModel返回一些东西,我想返回JIMSMessage类,我该怎么做呢。请帮帮我。

1 个答案:

答案 0 :(得分:2)

我不认为EventAggregator真正意味着以这种方式工作。它用于为任何关心接收这些事件的人发布事件,或者如果有兴趣收到有关事件的警报,则订阅事件。

它不能用于进行调用并在同一方法中等待返回值。

您可以做的是发布类似ShowMessage事件的内容,并订阅以接收MessageShown事件。

例如,您的ShellViewModel可能会订阅接收MessageDisplayed事件消息并按照以下方式处理它们:

public ShellViewModel(IEventAggregator events)
{
    // Subscribe to MessageDisplayed events
    events.GetEvent<MessageDisplayedEvent>().Subscribe(HandleMessageDisplayed);
}

void HandleMessageDisplayed(MessageDisplayedEvent e)
{
    if (e.SomeBooleanProperty)
        // Do Work
}

以及应用程序中的其他位置,您可以发布ShowMessage事件以显示消息

// Broadcast an Event
_events.GetEvent<ShowMessageEvent>().Publish(
    new ShowMessageEvent{ Message = "Enter Ledger Name." });

任何负责显示消息的类都会订阅接收ShowMessageEvent,显示消息,等待用户反馈,然后在结束时广播MessageDisplayed事件。

如果你有兴趣,我写了a Static class for the EventAggregator,这使得处理PRISM的EventAggregator变得更加简单。您可能有兴趣查看它。