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

时间:2013-08-06 18:34:40

标签: c# wpf mvvm-light

有人可以为我解释MVVM Light的Messenger吗?我在这里阅读StackOverflow上的帖子:MVVM pass values between view models试图得到这个。关于MVVM Light的文档在这一点上并不是那么好,所以我完全不确定去哪里。

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

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

在第一个ViewModel中:

MessengerInstance.Send<XDocument>(SelectedDocument);

在第二个:

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

可能是完全错误的。没有机会测试它,但当我这样做时,视觉工作室对我不那么生气了。在邮件发送之前,MessengerInstance也会注册。

1 个答案:

答案 0 :(得分:15)

  

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

这正是它的用途,是的。

发送讯息:

MessengerInstance.Send(payload, token);

收到消息:

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

有很多重载,所以如果不知道你想通过信使完成什么,我不会进入所有这些,但上面应该涵盖想要发送和接收消息的简单情况有效载荷。

请注意,“token”可以是识别邮件的任何内容。虽然通常使用字符串,但我更喜欢使用枚举,因为它更安全一些,并且可以实现智能感知,“查找用法”等。

例如:

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评论的网址更改为: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/