背景
MVVMLight已多年未更新,Microsoft.Toolkit.Mvvm作为MVVMLight继任者,需要学习一下。
Microsoft.Toolkit.Mvvm跟MVVMLight使用非常相似,但是默认没有提供Ioc容器,我这里仿照MVVMLight使用DryIoc作为依赖注入记录下使用过程。
使用方式
引入Microsoft.Toolkit.Mvvm 和 DryIoc
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="4.8.4" />
<PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" />
</ItemGroup>
添加ViewModel,View,Model文件夹
ViewModelLocator类的代码
using DryIoc;
namespace MvvmToolkitDemo.ViewModel
{
/// <summary>
/// 这个类包含对应用程序中所有视图模型的静态引用,并提供绑定的入口点。
/// </summary>
public class ViewModelLocator
{
Container _container;
/// <summary>
/// 构造函数
/// </summary>
public ViewModelLocator()
{
//初始化容器
_container = new Container();
//注册到容器中
_container.Register<MainViewModel>();
}
/// <summary>
/// MainViewModel视图模型的静态引用
/// </summary>
public MainViewModel Main
{
get
{
//通过容器获取实例对象
return _container.Resolve<MainViewModel>();
}
}
}
}
App.xaml添加ViewModel定位器资源字典
<Application x:Class="MvvmToolkitDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MvvmToolkitDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d1p1:Ignorable="d"
xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
StartupUri="View/MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:MvvmToolkitDemo.ViewModel" />
</ResourceDictionary>
</Application.Resources>
</Application>
MainViewModel.cs的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
namespace MvvmToolkitDemo.ViewModel
{
public class MainViewModel : ObservableObject
{
#region 属性字段
private string? _userName;
public string? UserName
{
get => _userName;
set => SetProperty(ref _userName, value);
}
private int _age;
public int Age
{
get => _age;
set => SetProperty(ref _age, value);
}
#endregion
/// <summary>
/// 按钮点击命令
/// </summary>
public ICommand BtnClick { get; set; }
public MainViewModel()
{
BtnClick = new RelayCommand<string>((obj) => DoRun(obj));
}
private void DoRun(string? obj)
{
Task.Run(() =>
{
int i = 0;
while (true)
{
i++;
Task.Delay(1000).GetAwaiter().GetResult();
Age = i;
}
});
}
}
}
具体使用文档:https://docs.microsoft.com/en-us/windows/communitytoolkit/mvvm/introduction
View中使用
DataContext="{Binding Source={StaticResource Locator},Path=Main}"
详细代码:
<Window x:Class="MvvmToolkitDemo.View.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MvvmToolkitDemo.ViewModel"
mc:Ignorable="d"
Title="MainView" Height="300" Width="500" WindowStartupLocation="CenterScreen"
DataContext="{Binding Source={StaticResource Locator},Path=Main}"
>
<StackPanel Margin="30">
<TextBlock Text="{Binding Age}" Margin="0 0 0 10"/>
<Button Content="Button" Command="{Binding BtnClick}" CommandParameter="参数" />
</StackPanel>
</Window>
把项目保存为Dotnet模板
- 在项目根目录新建 .template.config 文件夹
- 文件夹里新建template.json 代码如下:
{
"$schema": "http://json.schemastore.org/template",
"author": "Monns",
"classifications": ["Wpf"],
"name": "Microsoft.Toolkit.Mvvm.App",
"identity": "Microsoft.Toolkit.Mvvm.App",
"shortName": "mtma",
"tags": {
"language": "C#",
"type": "project"
},
"sourceName": "MvvmToolkitDemo", //这里是项目的名称,新建项目会替换掉
"preferNameDirectory": true
}
-
安装模板
dotnet new -i .\
-
新建项目
dotnet new mtma -n 项目名称
也可以在vs中找到此项目模板,直接使用此模板新建即可
使用nuget安装
安装donet模板
dotnet new --install MicrosoftToolkitMvvm.Template
新建项目
dotnet new mtmt -n 项目名称