c# - 使用 MVVM Light 的 Messenger 在 View 模型之间传递值

标签 c# wpf mvvm-light

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

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

编辑:这是我的新实现。截至目前,MessengerInstance 似乎不需要 token 。我非常困惑。

在第一个 ViewModel 中:

MessengerInstance.Send<XDocument>(SelectedDocument);

第二个:

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

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

最佳答案

Say I have two ViewModels and a ViewModelLocator. I want to be able to pass parameters between all three without issue. How would I go about doing this with the messenger? Is it capable of that?

这正是它的用途,是的。

发送消息:

MessengerInstance.Send(payload, token);

接收消息:

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

有很多重载,所以在不知道你想通过 Messenger 完成什么的情况下,我不会详细介绍所有重载,但上面的内容应该涵盖了想要发送和接收消息的简单情况有效载荷。

请注意,“ 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 评论的 URL 更改为: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

关于c# - 使用 MVVM Light 的 Messenger 在 View 模型之间传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087906/

相关文章:

c# - LINQ - 创建一个属性来存储 LINQ 语句的结果

c# - 如何在 c# mongo db 驱动程序中过滤数组元素

c# - 当没有满足任何 DataTrigger 值时设置属性 WPF

wpf - 使用触发器在鼠标悬停时设置文本 block 前景

c# - 使用 MVVM Light Messanger 代替事件

c# - 如何将包含包含数组的列表的列表从 C# 序列化为 JSON?

c# - 在 C# 中搜索字符串中每个单词的前几个字符

c# - WPF MVVM 从 BackgroundWorker 更新 UI 绑定(bind)属性

c# - .NET 将对象转换为...对象的目标是什么?

mvvm - 我们是否必须为每个ViewModel创建单独的ViewModel定位器?