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

本文关键字:之间 模型 Messenger 视图 Light MVVM 使用 | 更新日期: 2023-09-27 18:26:36

有人能为我解释一下MVVM Light的信使吗?我在这里读了一篇关于StackOverflow的文章:MVVM在视图模型之间传递值,试图获得这个值。MVVM Light上的文档目前还不太好,所以我完全不确定该去哪里。

假设我有两个ViewModels和一个ViewModelLocator。我希望能够在这三者之间无问题地传递参数。我该如何和信使一起做这件事?它能做到吗?

编辑:这是我的新实现。到目前为止,MessengerInstance似乎没有调用令牌。我非常困惑。

在第一个ViewModel中:

MessengerInstance.Send<XDocument>(SelectedDocument);

第二个:

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

可能是完全错误的。我还没有机会测试它,但当我这样做的时候,视觉工作室对我没有那么生气。此外,MessengerInstance会在发送消息之前进行注册。

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

假设我有两个ViewModels和一个ViewModelLocator。我希望能够在这三者之间无问题地传递参数。我该如何和信使一起做这件事?它能做到吗?

这正是它的用途,是的。

发送消息:

MessengerInstance.Send(payload, token);

接收消息:

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

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

请注意,"token"实际上可以是标识消息的任何东西。虽然字符串经常用于此,但我更喜欢使用枚举,因为它更安全,并且可以实现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;
}

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