跳转到内容

UWP:MVVM Light Toolkit介绍

嗯本文将结合具体代码帮助读者快速上手MvvmLight,我们希望读者已经了解Mvvm/DI/IoC的相关知识

最近仍然在学习一些包的用法,这次分享关于MvvmLight的相关用法

The MVVM Pattern

如果您是第一次接触Mvvm,请参考这篇文章,Mvvm的目的和具体方法在上面都有提及,在我们具体实现上,我们只需要注意逻辑分层,使用如上图合理的手段来联系层与层间就好了。

关于依赖注入和控制反转容器您需要知道

Section titled “关于依赖注入和控制反转容器您需要知道”

您可以参考这篇中文文章控制反转(IoC)与依赖注入(DI),我们说DI/IoC都是为了降低程序的耦合度,如果您对耦合度还没有感觉的话,可能是您代码写得太少,或者您使用某些编程技巧巧妙的避开了这个问题,不管怎样,能解决问题都是好的。

这里以这个系列的教程为叙述参考来说一下MvvmLight的主要功能

嗯这个我们懂的,就是提供一个更新提醒的接口。

// 通知UI层:名为"Name"的属性已经发生变化,需要刷新绑定了该属性的控件
RaisePropertyChanged(() => Name);

嗯这个就是所谓的IoC容器了我们可以把ViewModel和Server在里面register,然后以后就可以直接getinstance了

// 设置IoC容器的提供者为SimpleIoc,这是整个依赖注入体系的入口
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
// 将AppViewModel类型注册到IoC容器中,后续可通过GetInstance获取其实例
SimpleIoc.Default.Register<AppViewModel>();

嗯这个就是和XAML绑定的Command了

如果XAML是事件怎么办?嗯你需要使用EventToCommand解决方法 如

<CheckBox>
<!-- 借助Interaction库,将控件的事件转换为Command绑定,实现MVVM模式下的解耦 -->
<i:Interaction.Triggers>
<!-- 监听Checked事件,触发时执行绑定到CheckedCommand的RelayCommand -->
<i:EventTrigger EventName="Checked">
<command:EventToCommand Command="{Binding CheckedCommand}"></command:EventToCommand>
</i:EventTrigger>
<!-- 监听Unchecked事件,触发时执行绑定到UnCheckedCommand的RelayCommand -->
<i:EventTrigger EventName="Unchecked">
<command:EventToCommand Command="{Binding UnCheckedCommand}"></command:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>

说起来这个i可能需要额外装包呢。

嗯这个就是最重要的消息机制的了,总之一个地方注册一个处理方法,然后就可以消息传递了。

// 注册一个消息接收者:当收到SendMessageToken标记的string类型消息时,执行Lambda更新Msg
Messenger.Default.Register<string>(this, MessageToken.SendMessageToken, (msg) =>
{
Msg = msg;
});
// token 大概只是个确定特定接受方的字符串
// 发送一条string类型的消息,所有注册了对应Token的接收者都会收到此消息
Messenger.Default.Send<string>(Msg, MessageToken.SendMessageToken);

嗯这个就是我们非UI线程与UI线程通信用的了,大概就是在app.cs里面初始化,然后在需要的时候调用接口就好。

// 在App启动时初始化DispatcherHelper,使其关联到UI线程的Dispatcher
DispatcherHelper.Initialize();
// 在非UI线程中调用此方法,将操作调度到UI线程执行,避免跨线程访问UI控件时的异常
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Teacher.Students.Add(new Student()
{
Name = "LaoLi",
Age = 25
});
});

就像在一开始说的,本文需要读者预先对一些知识有一定了解,MvvmLight提供了MVVM模式下编程的很多需要使用的模式/解决方案的封装,如果读者本身对MVVM了解就不够多,那么可能看起来就有点云里雾里。