9

MVVM Light の Messenger について説明してくれる人はいますか? ここで StackOverflow に関する投稿を読んでいまし。現時点では、MVVM Light に関するドキュメントはそれほど優れていないため、どこに行けばよいかまったくわかりません。

2 つの ViewModel と 1 つの ViewModelLocator があるとします。問題なく 3 つすべての間でパラメーターを渡すことができるようにしたいと考えています。メッセンジャーでこれを行うにはどうすればよいですか?それは可能ですか?

編集:これが私の新しい実装です。現時点では、MessengerInstance がトークンを要求していないようです。私はひどく混乱しています。

最初の ViewModel で:

MessengerInstance.Send<XDocument>(SelectedDocument);

そして2番目に:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));

完全に間違っている可能性があります。テストする機会はありませんが、この方法で行うと、ビジュアル スタジオの怒りは減ります。また、Message が送信される前に MessengerInstance が登録されます。

4

1 に答える 1

19

2 つの ViewModel と 1 つの ViewModelLocator があるとします。問題なく 3 つすべての間でパラメーターを渡すことができるようにしたいと考えています。メッセンジャーでこれを行うにはどうすればよいですか?それは可能ですか?

まさにそのためです、はい。

メッセージを送信するには:

MessengerInstance.Send(payload, token);

メッセージを受信するには:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload));

多くのオーバーロードがあるため、メッセンジャーを介して何を達成しようとしているのかを正確に把握していないため、すべてを説明することはできませんが、上記は、ペイロードを使用してメッセージを送受信するという単純なケースをカバーする必要があります。

「トークン」は、実際にはメッセージを識別するものであれば何でもよいことに注意してください。これには文字列がよく使用されますが、私は enum を使用することを好みます。これは、少し安全であり、IntelliSense や「使用箇所の検索」などが可能になるためです。

例えば:

public enum MessengerToken
{
    BrushChanged,
    WidthChanged,
    HeightChanged
}

次に、送受信は次のようになります。

// sending view model
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged);

// receiving view model

// put this line in the constructor
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush));

public void ChangeColor(Brush brush)
{
    Brush = brush;
}

[編集] 以下の devuxer のコメントへの URL が次のように変更されました: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

于 2013-08-06T18:38:35.157 に答える