MVVM是Model-View-ViewModel的简写。类似于目前比较流行的MVC、MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的耦合。
它是一种极度优秀的设计模式,但并非框架级别的东西,由MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构。
1、安装
参考:https://www.cnblogs.com/wzh2010/p/6285954.html
主要使用方式有两种;
一种是去官网上下载MVVMLight Toolkit,安装之后,VS模板中会出现MvvmLight项目模板,你可以直接使用该项目模板来创建项目了。里面会包含默认的ViewModelLocator和MainViewModel,MainViewModel就是你Main视图的ViewModel了,而ViewModelLocator是一个全局的ViewModel加载注册器。
安装方式参考:https://www.cnblogs.com/HelloMyWorld/archive/2013/03/07/2947942.html
另一种方式就是去NuGet上安装,这无疑是最便捷的事了。在NuGet 工具箱上搜索 MVVM Light,可以看到两个项目,一个是MVVM Light , 一个是 MVVM Light libraries only。
Nuget上这两个项目的区别就是MVVM Light除了必要的GalaSoft 组件之外,还会额外添加相关分层文件目录形成简单的MVVMLight成型框架。它会帮你生成ViewModel文件夹,里面包含MainViewModel和ViewModelLocator文件。
这种方式还有一个好处,你总是可以得到最新的版本,因为nuget package是自动有更新提示的。而如果你是用Toolkit的话,则得不到更新的提示。
使用NuGet查找和安装MVVM Light
要在NuGet中查找MVVM Light,请按照以下步骤操作:
- 在Visual Studio中打开您的项目。
- 右键单击References文件夹,然后从上下文菜单中选择“Manage Nuget Packages ...”。(管理Nuget包)
- 在“管理Nuget包”对话框中,选择所有。
- 在搜索字段中,输入“mvvmlight”。
- 选择MVVM Light包并按下Install按钮。
完成这些步骤后,对您的项目进行了以下更改:
添加了“packages”文件夹以及以下库。请注意,此文件夹将添加到项目结构的根目录中,而不会显示在“解决方案资源管理器”中。添加了另外两个类的ViewModel文件夹:
ViewModelLocator.cs //做为全局资源,用来联系View相对应的viewmodel
<Application x:Class="MvvmLightDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MvvmLightDemo" StartupUri="MainWindow.xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"> <Application.Resources> <ResourceDictionary> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:MvvmLightDemo.ViewModel" /> </ResourceDictionary> </Application.Resources> </Application>
MainViewModel.cs //自动为主窗口生成的viewmodel,可以删除,然后自定义。
通过添加ViewModelLocator作为全局资源来修改App.xaml文件。(已经自动添加,需要重新编译一下)
所以每次App初始化的时候,就会去初始化ViewModelLocator类。
实际上他就是一个很基本的视图模型注入器。在构造器中把使用到的ViewModel统一注册,并生成单一实例。
然后使用属性把它暴露出来,每当我们访问属性的时候,就会返回相应的ViewModel实例。
2、使用
参考:https://www.cnblogs.com/manupstairs/p/4909585.html 这里是一个简单的例子。
1、直接在项目上增加的话,可能会因为缺少引用报错,需要手动增加一些USING,
2、如果有新的界面与新的viewmodel,则需要在ViewModelLocator中注册我们写好的ViewModel。
a) 在的构造函数中增加 SimpleIoc.Default.Register<自定义的ViewModel>();
b) 在类中实例化: public MainViewModel 自定义的实例{ get {return ServiceLocator.Current.GetInstance<自定义的ViewModel>(); } }
3、Model中,对应的字段属性需要有通知事件,在对应的ViewModel定义的集合或者字段也需要有通知事件。
4、界面与后台的绑定,
前台:在<Window>标签中增加 DataContext="{Binding Source={StaticResource Locator},Path=注册的自定义实例}"
后台:在对应的.cs的构造函数中增加 this.DataContext = new 自定义的ViewModel();
5、引用报错的问题
安装完成后,在使用过程中,可能会遇到问题报错,查询资料显示可能是由于MvvmLight没有及时更新,如果将图中的CommonServiceLocator升级到最新的2.x版本之后,它所依赖的ServiceLication的名称空间变为了CommonServiceLocator,导致安装MvvmLight之后自动生成的代码就出现了错误,如果你使用了最新版本,那么就需要手动修改一下这个名称空间,或者删除这个命令空间~
6、Set方法来给属性赋值报错。
Set方法可能报错,这里有三个方法:
1、将 set { Set(ref title , value); } 改成 set {Set("Title",ref title, value)};
2、将 set { Set(ref title , value); } 改成 set { title = value; RaisePropertyChanged(()=>Title); };
3、将 set { Set(ref title , value); } 改成 set { title = value; RaisePropertyChanged(“Title”); };
3、绑定
参考地址:https://blog.csdn.net/colingg/article/details/85624751 主要是ViewModelLocator文件介绍。
参考地址:https://www.cnblogs.com/wzh2010/p/6286923.html 主要是View文件中的绑定。
参考地址:https://www.cnblogs.com/scy251147/p/3791954.html 主要是绑定命令的深入理解。
参考地址:https://www.cnblogs.com/wzh2010/p/6425060.html 主要是绑定命令的应用理解。
4、其它参考资料
MvvmLight ToolKit 教程:https://www.cnblogs.com/HelloMyWorld/p/4750070.html
MVVM、MVVMLight、MVVMLight Toolkit之我见:https://www.cnblogs.com/chenxizhang/archive/2011/10/01/2197786.html