2013-08-06 66 views
6

有人能为我解释MVVM Light的Messenger吗?我在这里阅读StackOverflow的一篇文章:MVVM pass values between view models试图得到这个。有关MVVM Light的文档在这一点上并不太好,所以我完全不确定要去哪里。使用MVVM Light的Messenger在视图模型之间传递值

说我有两个ViewModels和一个ViewModelLocator。我希望能够在所有三个之间传递参数而没有问题。我该如何去使用这个使者去做这件事?它有能力吗?

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

在第一个视图模型:

MessengerInstance.Send<XDocument>(SelectedDocument); 

而在第二个:

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

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

+0

“,但视觉工作室得到与少生气当我这样做时“。哈。这让我轻笑。 :) –

回答

12

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

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

+0

这是完美的!我试过在这方面搜索文档,但没有发现。你知道我可能错过的任何文件吗?我几乎没有看到MVVM Light。 – DanteTheEgregore

+0

开发MVVM Light的人,Laurent Bugnion倾向于使用他的博客介绍新功能或功能更新。以下是您可能会发现有用的信使的特定条目:http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta。aspx – devuxer

+0

我一直在外科手术,直到今天都没有机会开始实施。我看不到MessengerInstance在哪里调用令牌。我会将我的实现添加到主帖子中。我也在这里发布了另一个问题:http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore

相关问题