MVVMlight Messenger.

信息

消息是模型视图视图模型(MVVM)模式方法中使用的常用模式。它们允许ViewModel和模型与视图进行通信,而无需将它们耦合到它。消息通常用于传达系统内的更改。与他们提供的事件类似,如果需要,消息提供了C#对象的所有功能。在此帖子中,我将向您展示如何创建消息,发送,最后是如何在对象中注册定义消息的处理程序。

设置项目

演示项目将成为Windows Phone 8.1解决方案。你必须安装 MVVM光 尼古特包。我们将有一个简单的视图,包含标签和一个按钮:

<Page    x:Class="Messenger.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:Messenger"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d"    DataContext="{Binding Source={StaticResource Locator}, Path=Main}"    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">        <TextBlock Text="{Binding InvokedMessage}" Style="{StaticResource MessageDialogContentStyle}"                   Margin="0,10" />        <Button Content="Invoke Service" HorizontalAlignment="Center" Command="{Binding InvokeServiceCommand}" Width="200" Margin="0,10" />    </StackPanel></Page>

该按钮触发ViewModel中的命令,该命令调用服务的更新:

private void InvokeService(){    CanInvokeService = false;    _sampleService.nonblockingasyncmethod.();}

该服务是一种异步缺点方法,这意味着它无法等待。延迟传递后,应向任何接收器发送消息:

public async void nonblockingasyncmethod.(){    _invokedCount += 1;    await Task.Delay(3000);    GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(new SampleMessage(_invokedCount));}

所以让我们看看如何实现消息。

创建消息

消息是从MessageBase继承的POCO(普通旧CLR对象)。由开发人员提供多少个属性甚至函数,应添加到消息中。通常,应将消息视为数据对象。

internal class SampleMessage:MessageBase{    public SampleMessage(int invokedCount):base()    {        InvokedCount = invokedCount;    }    public int InvokedCount { get; set; }}

对于我们的示例,我们将简单地添加一个count属性,指示服务已调用的呼叫数量。

发送消息

发送消息只是通过调用来完成 发送 在默认杂像器上的方法,正如它所做的那样 nonblockingasyncmethod. 在里面 samplesservice.:

GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(new SampleMessage(_invokedCount));

所以现在我们所要做的就是注册我们的接收者。

订阅/注册消息接收器

在视图模型上,我们可以注册一个处理程序,该处理程序接收消息并使用根据呼叫更新标签:

GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<SampleMessage>(this, ReceiveSampleMessage);

这是在 MainViewModel..

结论

消息传递允许将需要彼此通信的对象删除。在我们的示例中,服务与ViewModel通信,但没有视图的任何直接引用,因此完全解耦它。消息传递可以在编写可维护的代码方面有很大的帮助,但是被告知,虽然此方法确实允许将其解耦它也会增加复杂性,因此将方法传递为调用回呼函数可能是与开发人员通信的更直接的方式。

您可以找到整个代码 GitHub..

参考

Laurent Bugnion. 谁是MVVM轻型框架的创造者和维护者。

Updated: