WPF使用Microsoft.Toolkit.Mvvm作为Mvvm框架DryIoc作依赖注入
背景
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 项目名称
Gitee仓库
WPF使用Microsoft.Toolkit.Mvvm作为Mvvm框架DryIoc作依赖注入的更多相关文章
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...
- Spring框架学习之依赖注入
Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...
- 从零写Java Web框架——实现Ioc依赖注入
大概思路 通过读取配置文件,获取框架要加载的包路径:base-package,类似于 Spring 配置文件中的: <context:component-scan base-package=&q ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- Spring框架中的依赖注入
依赖注入(DI : Dependency Injection)是基于.xml配置文件内节点的书写. 注入类型: 1.设置注入,调用了Bean的setXXX()进行值注入 普通属性(value值表示要显 ...
- 使用 .NETCore自带框架快速实现依赖注入
Startup 在Startup的ConfigureServices()中配置DI的接口与其实现 public void ConfigureServices(IServiceCollection se ...
- ASP.NET Core技术研究-探秘依赖注入框架
ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
- 类比Spring框架来实现OC中的依赖注入
如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...
随机推荐
- AI五子棋_09 消息循环实现自动对局
AI五子棋 第九步 恭喜你到达第九步! 上一步我们已经完成了一个AI大脑的最核心功能.我们可以用它来对战了. 访问服务器 http://202.207.12.156:9012/join_game,会返 ...
- Discuz7.2 XML漏洞
Discuz7.2 导入插件数据可以生成一句话木马,直接getshell. 姿势:版主的"管理中心" => "插件" => "导入&quo ...
- 增强 vw/rem 移动端适配,适配宽屏、桌面端、三折屏
vw 和 rem 是两个神奇的 CSS 长度单位,认识它们之前,我一度认为招聘广告上的"像素级还原"是一种超能力,我想具备这种能力的人,一定专业过硬.有一双高分辨率的深邃大眼睛. ...
- 10.Kubernetes核心技术Service
Kubernetes核心技术Service 前言 前面我们了解到 Deployment 只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题.一个Pod只是一个运行服务的实例,随 ...
- 基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
前言 今天大姚给大家分享一个基于C#开源.功能强大.灵活的跨平台开发框架:Uno Platform.通过 Uno Platform,开发者可以利用单一代码库实现多平台兼容,极大地提高了开发效率和代码复 ...
- 用 300 行代码手写提炼 Spring 核心原理 [3]
系列文章 用 300 行代码手写提炼 Spring 核心原理 [1] 用 300 行代码手写提炼 Spring 核心原理 [2] 用 300 行代码手写提炼 Spring 核心原理 [3] 上文 中我 ...
- Jenkins之插件汇总
Nodejs: 构建前端项目或Node项目 Build Name and Description Setter Publish over SSH: 远程执行shell命令 Blue Ocean 友 ...
- Python之读写Excel
现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要是第三方模块库xlrd.xlwt.pyexcel-xls ...
- 如何使用docsify搭建自己的github文档?
安装前提 确认电脑已经安装好 node 和 npm 环境. 如果还没有装好,那需要执行下面的步骤: 1.进入官网:https://nodejs.org/zh-cn/ , 下载长期支持版. 2.安装就直 ...
- go build tags使用
转载请注明出处: 在 Go 语言中,构建标签(Build Tags)是一种用于条件编译的机制,可以帮助开发者根据不同的条件选择性地编译特定的代码块.它们在处理多平台和多环境的代码时特别有用,例如为不同 ...