【问题标题】:Use MVVM Light's Messenger to Pass Values Between View Model使用 MVVM Light 的 Messenger 在 View Model 之间传递值
【发布时间】:2013-08-06 18:34:39
【问题描述】:

有人可以为我解释一下 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));

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

【问题讨论】:

  • “但是当我这样做时,Visual Studio 对我的愤怒会减少”。哈。这让我笑了。 :)

标签: c# wpf mvvm-light


【解决方案1】:

假设我有两个 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;
}

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

【讨论】:

  • 这太完美了!我试过搜索这方面的文档,但没有找到。你知道我可能遗漏的任何文件吗?我几乎没有看到 MVVM Light。
  • 开发 MVVM Light 的人 Laurent Bugnion 倾向于使用他的博客来介绍新功能或功能更新。这是 Messenger 上的一个特定条目,您可能会觉得有帮助:blog.galasoft.ch/lbugnion/archive/2009/09/27/…
  • 我一直在做手术,直到今天才有机会开始实施。我看不到 MessengerInstance 要求令牌的位置。我会将我的实现添加到主帖中。我还在这里发布了另一个问题:stackoverflow.com/questions/18241290/…
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2011-06-16
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多