一、前言

    先简单谈谈为什么选择学习使用这个MVVM框架。
    接触.NET和WPF有一阵子了,用过WPF的应该都听说过MVVM模式,它是一种分离前后端、松耦合的模式。某种程度上来说是MVC和MVP的升级版,也一定程度上解决了前两者存在的一些问题。因为是模式,所以不仅限于WPF这一种开发,许多涉及UI的开发都会用到它,比如Vue。
    既然它这么优秀,我自然想使用它。但由于我接触.NET和WPF时间都不长,很多基础知识掌握不好,所以我决定先使用原生的MVVM,即不用任何框架,自己先徒手实现试试。这样做或许比较费力,最终做出来的东西结构设计上也不完美,但对于整个过程和实现中的一些难点上的体会会更深,在后续使用框架开发时候应该会有一些额外收获。
    确实,第一个项目做出来了,有点不伦不类,就自己硬建了几个文件夹View、Model、ViewModel,然后开始套模式,开始绑定变量,开始绑定命令。就是在绑定命令这一步上,让我觉得WPF在原生的MVVM上支持太复杂了,因为你需要自己重写有关ICommand的一切。而反观几种主流的MVVM框架(MvvmLight、Prism等)在命令的使用上都非常简洁。于是,我的第二个WPF项目也决定使用框架。
    使用框架,必然少不了选择框架。起初打算用Prism,因为相对来说,它功能最强大,支持最好。于是从NuGet下载添加进项目,然后准备开始学习,翻了翻博客,翻了翻GitHub,感觉它的学习方式主要是零零散散的博客&GitHub上的样例,说实话,不太系统(主要是我太菜,看样例太累)。于是转MvvmLight,网上都说这个框架比较轻量级,且简单易上手。确实,我搜Mvvm的时候,它出来的词条最多。于是从NuGet搜了下,好家伙!
在这里插入图片描述
似乎几年前就停更了,当然想用它,还是一点问题都没有的。但紧接着,一行小字吸引了我。
在这里插入图片描述
这是它的替代品么?怀着好奇,我点了进去。它是一个微软官方提供支持的Mvvm包,而且有着详细的文档,被称为MvvmLight的继承者。在这机缘巧合之下,我选择了它,当然好不好用还不知道,先用用看,不好用再换。总结一下,我选它是因为微软官方的 + 文档详细 +

二、MVVM Toolkit概述

    首先,放一下它的文档链接,喜欢啃文档的自己去看。
    Microsoft.Toolkit.Mvvm包(也称MVVM Toolkit)是一个现代、快速且模块化的MVVM库。它是Windows社区工具包的一部分并且围绕着以下几点原则构建的:

  • 平台和运行时库相独立 - .NET 2.0标准和.NET 5(与UI框架无关)
  • 简单易用 - 在程序结构和编码范式上没有严格要求,即使用灵活
  • 自由组件 - 自由选择要使用的组件
  • 参考实现 - 精炼且性能好,提供了基础库的接口实现,但缺乏直接使用它们的具体类型

这个包针对是.NET标准的,所以它能应用于任何平台:UWP,WinForms,WPF,Xamarin,Uno等;以及任何运行环境下:.NET Native, .NET Core, .NET Framework, or Mono。它能在它们之上运行。且API在所有情况下都是相同的,这使得它非常适合构建共享库。

    此外,MVVM工具包还有专门针对.NET 5的优化点,使得在.NET 5运行时会有更多内部优化。当然,两种情况下的API是相同的,NuGet总是会解析出包的最佳版本,而不需要用户担心API在平台上是否可用。

    在VS当中安装包:

  1. 在解决方案管理器中,右击工程,然后选择管理NuGet包。搜索Microsoft.Toolkit.Mvvm并安装它。
    在这里插入图片描述
  2. 添加一个using指令来使用API:
using Microsoft.Toolkit.Mvvm;
  1. 代码示例可以在MVVM Toolkit的其他文档页面和项目的单元测试中找到

2.1. 何时使用MVVM工具包

使用该包可以访问一组标准的、独立的、轻量级的类型,这些类型为使用MVVM模式的程序提供了起始实现。通常,这些类型本身就足以满足用户的需求,而不需要额外的外部引用。

包括的类型有:

  • Microsoft.Toolkit.Mvvm.ComponentModel
    • ObservableObject
    • ObservableRecipient
    • ObservableValidator
  • Microsoft.Toolkit.Mvvm.DependencyInjection
    • Ioc
  • Microsoft.Toolkit.Mvvm.Input
    • RelayCommand
    • RelayCommand<T>
    • AsyncRelayCommand
    • AsyncRelayCommand<T>
    • IRelayCommand
    • IRelayCommand<in T>
    • IAsyncRelayCommand
    • IAsyncRelayCommand<in T>
  • Microsoft.Toolkit.Mvvm.Messaging
    • IMessanger
    • WeakReferenceMessenger
    • StrongReferenceMessenger
    • IRecipient<TMessage>
    • MessageHandler<TRecipient, TMessage>
  • Microsoft.Toolkit.Mvvm.Messaging.Messages
    • PropertyChangedMessage<T>
    • RequestMessage<T>
    • AsyncRequestMessage<T>
    • CollectionRequestMessage<T>
    • AsyncCollectionRequestMessage<T>
    • ValueChangedMessage<T>

这个包旨在提供更多的灵活性,使得开发者能自由选择使用哪些组件。所有的类型都是松耦合的(loosely-coupled),因此只需要包含你需要用到的。当使用它们来构建程序时,没有必要完全使用特定的API,也没有一套强制性的模式要遵循。

这节的内容和标题好像没有太强烈的关系,不过硬理解一下就是如果你的程序要用Mvvm模式,你可以用这个包。且包中的众多类型你用得着的就用,用不着的就不用。

2.2. 更多资源

三、小结

这节主要是大概讲讲MVVM Toolkit是什么以及如何加入到项目中。接下来开始正式学习。

Logo

秉承“创新、开放、协作、共享”的开源价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新时代开发者培养的开源创新生态!支持公有云使用、私有化部署以及软硬一体化私有部署。

更多推荐