9

有人可以为我解释一下 MVVM Light 的 Messenger 吗?我在这里读了一篇关于 StackOverflow 的文章:MVVM pass values between view models trying to get this。目前关于 MVVM Light 的文档还不是很好,所以我完全不确定该去哪里。

假设我有两个 ViewModel 和一个 ViewModelLocator。我希望能够在所有三个之间传递参数而不会出现问题。我将如何与信使一起做这件事?它有这个能力吗?

编辑:这是我的新实现。到目前为止,看起来 MessengerInstance 似乎不需要令牌。我非常困惑。

在第一个 ViewModel 中:

MessengerInstance.Send<XDocument>(SelectedDocument);

在第二个:

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

可能是完全错误的。还没有机会对其进行测试,但是当我这样做时,Visual Studio 对我的愤怒会减少。MessengerInstance 也会在消息发送之前注册。

4

1 回答 1

19

假设我有两个 ViewModel 和一个 ViewModelLocator。我希望能够在所有三个之间传递参数而不会出现问题。我将如何与信使一起做这件事?它有这个能力吗?

这正是它的用途,是的。

要发送消息:

MessengerInstance.Send(payload, token);

要接收消息:

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

有很多重载,所以在不知道你想通过信使完成什么的情况下,我不会全部介绍,但上面应该涵盖想要发送和接收带有有效负载的消息的简单情况。

请注意,“令牌”实际上可以是任何标识消息的东西。虽然通常为此使用字符串,但我更喜欢使用枚举,因为它更安全一些,并且可以启用智能感知、“查找用法”等。

例如:

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 回答