WPF使用Microsoft.Toolkit.Mvvm作为Mvvm框架DryIoc作依赖注入

背景#

MVVMLight已多年未更新,Microsoft.Toolkit.Mvvm作为MVVMLight继任者,需要学习一下。
Microsoft.Toolkit.Mvvm跟MVVMLight使用非常相似,但是默认没有提供Ioc容器,我这里仿照MVVMLight使用DryIoc作为依赖注入记录下使用过程。

使用方式#

引入Microsoft.Toolkit.Mvvm 和 DryIoc#

Copy
<ItemGroup> <PackageReference Include="DryIoc.dll" Version="4.8.4" /> <PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" /> </ItemGroup>

添加ViewModel,View,Model文件夹#

ViewModelLocator类的代码#

Copy
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定位器资源字典#

Copy
<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的代码#

Copy
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}"

详细代码:

Copy
<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模板#

  1. 在项目根目录新建 .template.config 文件夹
  2. 文件夹里新建template.json 代码如下:
Copy
{ "$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 }
  1. 安装模板
    dotnet new -i .\

  2. 新建项目
    dotnet new mtma -n 项目名称

也可以在vs中找到此项目模板,直接使用此模板新建即可

使用nuget安装#

安装donet模板#

dotnet new --install MicrosoftToolkitMvvm.Template

新建项目#

dotnet new mtmt -n 项目名称

Gitee仓库#

https://gitee.com/ie81/microsoft-toolkit-mvvm-template

posted @   Monns  阅读(1155)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS