使用MVVM Light的Messenger在视图模型之间传递值

Dan*_*ore 8 c# wpf mvvm-light

有人可以帮我解释一下MVVM Light的Messenger吗?我在这里阅读StackOverflow上的一篇文章:MVVM在试图得到这个的视图模型之间传递值.关于MVVM Light的文档在这一点上并不是那么好,所以我完全不确定去哪里.

假设我有两个ViewModel和一个ViewModelLocator.我希望能够在没有问题的情况下在所有三个之间传递参数.我将如何与信使一起做这件事?它有能力做到吗?

编辑:这是我的新实现.截至目前,看起来好像MessengerInstance没有调用令牌.我非常困惑.

在第一个ViewModel中:

MessengerInstance.Send<XDocument>(SelectedDocument);
Run Code Online (Sandbox Code Playgroud)

在第二个:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));
Run Code Online (Sandbox Code Playgroud)

可能完全错了.没有机会测试它,但当我这样做时,视觉工作室对我不那么生气了.MessengerInstance也会在发送消息之前进行注册.

dev*_*xer 16

假设我有两个ViewModel和一个ViewModelLocator.我希望能够在没有问题的情况下在所有三个之间传递参数.我将如何与信使一起做这件事?它有能力做到吗?

这正是它的用途,是的.

要发送消息:

MessengerInstance.Send(payload, token);
Run Code Online (Sandbox Code Playgroud)

要收到消息:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload));
Run Code Online (Sandbox Code Playgroud)

有许多重载,所以如果不知道你想通过信使完成什么,我将不会涉及所有这些,但上面应该涵盖想要发送和接收带有效负载的消息的简单情况.

请注意,"令牌"可以是识别消息的任何内容.虽然通常使用字符串,但我更喜欢使用枚举,因为它更安全一些,并且能够实现智能感知,"查找用法"等.

例如:

public enum MessengerToken
{
    BrushChanged,
    WidthChanged,
    HeightChanged
}
Run Code Online (Sandbox Code Playgroud)

然后你的发送/接收将是这样的:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

[编辑]以下devuxer评论的URL更改为:http: //blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/