0

IEventAggregator を持つ ShellWindow があり、すべての子がこの IEventAggregator に公開されていますか?

今私は、ShellViewModel の IEventAggregator に発行する JIMSMessage という名前の静的クラスを持っています。

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 クラスに返したいのですが、どうすればこれを行うことができますか。私を助けてください。

4

1 に答える 1

2

EventAggregatorが本当にそのように機能することを意図しているとは思いません。イベントを受信したい人のためにイベントを発行したり、イベントについてアラートを受け取ることに関心がある場合にイベントをサブスクライブしたりするために使用されます。

同じメソッド内で呼び出しを行い、戻り値を待つために使用することは意図されていません。

代わりにできることは、ShowMessageイベントのようなものを公開し、サブスクライブしてMessageShownイベントを受信することです。

たとえば、ShellViewModelMessageDisplayed イベント メッセージを受信するようにサブスクライブし、次のように処理できます。

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." });

そして、メッセージの表示を担当するクラスは、 receiveShowMessageEventにサブスクライブし、メッセージを表示し、ユーザーのフィードバックを待ち、MessageDisplayed終了時に結果を含むイベントをブロードキャストします。

また、興味があれば、PRISM の処理を​​より簡単にする EventAggregator の Static クラスを作成しました。EventAggregatorあなたはそれをチェックすることに興味があるかもしれません.

于 2012-09-24T19:36:13.463 に答える