MvvmLight框架使用入门(5)
上一次写MvvmLight框架使用入门(4)的时候还在用Visual Studio 2015,我儿子也不会过来盖上我的XPS……重启这个系列一方面是因为最近又开始写UWP的东西了,另一个是因为MvvmLight支持.NET Standard后,在使用上发生了一点小变化。在连续被问了几次
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
的兼容性问题后,我决定去调查一下事情的真相。
首先我们去Github上确认一下MvvmLight的最新版本。
https://github.com/lbugnion/mvvmlight
作者可能觉得没有什么挑战了,更新相对不再频繁。这两年最重大的改变就是对.NET Standard的支持。我们可以看到MvvmLight分为以下几个版本:

MvvmLightLibs和MvvmLight可以认为是同一个库,唯一不同后者会包含ViewModelLocator之类的帮助类。这两个库适用于WPF(.NET Framework)和UWP project。
MvvmLightAndroidSupport没用过不敢乱讲,略过。
MvvmLightLibsStd10和MvvmLightStd10也基本相同,增加了对.NET Standard的支持。这两个库适用于WPF(.NET Framework),WPF(.NET Core)和UWP project。
这里有两点值得注意:
- 只有WPF(.NET Framework)工程,才能通过MvvmLight或MvvmLightStd10,如愿生成ViewModelLocator,MainViewModel等帮助类。
- Std10版本的MvvmLight,不再依赖CommonServiceLocator。所以从旧有代码升级的项目,会遇到一个兼容性的问题。

那么如何修复这个问题呢?从MvvmLight的源码来看,在.NET Standard分支上,SimpleIoc这个类已经不再继承IServiceLocator接口。也不再通过
ServiceLocator.Current.GetInstance<MainViewModel>();
来获取对象的实例,而是直接通过
SimpleIoc.Default.GetInstance<MainViewModel>();
来实现相同的功能。所以我们只要简单的删除报错的这句:
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
同时将之前使用ServiceLocator的代码修改如下即可:
public MainViewModel Main
{
get
{
return SimpleIoc.Default.GetInstance<MainViewModel>();
}
}
我们再来说下VSIX packages的问题,从Github页面的issue来看,作者提交过VS2019的版本,可能因为VS2019版本更新频繁,和最新版发生冲突又被下架了。相信作者后续会再更新上去,毕竟issue里有那么多人在不停的问这个事情。
其实VSIX也不是必须的,我通常都是通过Nuget添加MvvmLight的引用,而不是使用VSIX,所以这个问题影响不大。
最后总结一下MvvmLight在2020年的推荐使用方式:
- 使用MvvmLightStd10在WPF(.NET Framework)工程
- 使用MvvmLightLibsStd10在WPF(.NET Core)和UWP 工程。
- 可以保存生成好的ViewModelLocator等文件,拷贝到WPF(.NET Core)和UWP工程中使用。
之前的篇章在介绍MvvmLight时并没有在Github上创建sameple project。这次一并补上:
https://github.com/manupstairs/MvvmLightSample
后续会把这个系列补完,绝不太监……
MvvmLight框架使用入门(5)的更多相关文章
- MvvmLight框架使用入门(四)
本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...
- MvvmLight框架使用入门(三)
本篇是MvvmLight框架使用入门的第三篇.从本篇开始,所有代码将通过Windows 10的Universal App来演示.我们将创建一个Universal App并应用MvvmLight框架. ...
- MvvmLight框架使用入门(一)
MvvmLight是比较流行的MVVM框架,相对较为简单易用.可能正因为简单,对应的帮助文档不多,对初学者就不够友好了.这里会用几篇随笔,就个人对MvvmLight的使用经验,来做一个入门的介绍. 第 ...
- MvvmLight框架使用入门(二)
上一篇我们简单对MvvmLight做了介绍.罗列了三个DLL中,各个命名空间下主要类的定义及大致作用.因为只是范范的概论,对于从未接触过MvvmLight的萌新来说,根本就是在晃点他们.不过万事开头难 ...
- MVVMlight框架应用:Data Binding、Command
常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的:在MVVMLight框架里,这里我们定 ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据
OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
- 通过Nuget添加Mvvmlight框架发生错误
IDE:Visual Studio 2013 场景:通过Nuget添加Mvvmlight框架 具体错误: 解决办法:删除Nuget,然后添加新版本的Nuget Package Manager 具体操作 ...
随机推荐
- 2020-07-07:mysql如何实现跨库join查询?
福哥答案2020-07-07: 1.同服务跨库.表名称带上库名.SELECT * FROM 数据库名称1.表名称 JOIN 数据库名称2.表名称 ON 数据库名称1.表名称.tid = 数据库名称2. ...
- C#LeetCode刷题之#746-使用最小花费爬楼梯( Min Cost Climbing Stairs)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4016 访问. 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个 ...
- Linux内核之 进程调度
上一篇我们提到过进程状态,而进程调度主要是针对TASK_RUNNING运行状态进行调度,因为其他状态是不可执行比如睡眠,不需要调度. 1.进程调度概念 进程调度程序,简称调度程序,它是确保进程能有效工 ...
- topic的相关操作
1.建立topic cd 进入kafka的安装根目录的bin目录下 执行:./kafka-topics.sh --zookeeper ip:port,ip:port,ip:port/kafka-tes ...
- Windows 安装 kafka
1.kafka下载地址:http://kafka.apache.org/downloads 解压:kafka_2.12-2.6.0.tgz 2.配置zookeeper 进入config目录找到文件zo ...
- 笔记:html基础
一.HTML:超文本标记语言,是一种标签语言,不是编程语言,显示数据有双标签<body></body> 和单标签<img src=# / >, 标签大小写都可以 通 ...
- Kubernetes 中 Informer 的使用
原文链接:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247485580&idx=1&sn=7392dbadf ...
- centos AAVMF_CODE.fd 文件下载
centos: yum install AAVMF -y ubuntu: apt-get install qemu-efi*
- MPI小例子
MPI示例 MPI时间函数测试 #include<stdio.h> #include<mpi.h> #include<stdlib.h> #include<t ...
- JS学习阶段性总结-1
各种函数的声明 /** * 函数的声明 */ // 声明一个方法,任意调用 function aaa(args){...} // 声明一个函数并以变量的形式展示出去,因此无法再声明前调用 var fn ...