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 ...
随机推荐
- 微软nuget国内源
https://www.cnblogs.com/Leo_wl/p/16328650.html 为解决国内访问NuGet服务器速度不稳定的问题 ,这里推荐使用NuGet微软官方中国国内镜像 地址:htt ...
- Power BI 通过输入数据新建表后重新进入编辑状态
在使用Power BI时,有时候我们会直接通过输入数据构建一些简单的表,但是构建好后我们可能还需要对表格进行增删改的操作,这时候我们需要怎么才会恢复到表格的编辑状态呢?其实很简单,我们回到PQ里面,双 ...
- 采用线性回归实现训练和预测(Python)
已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示.现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量. 测得数据如下图所示: imp ...
- 让性能提升56%的Vue3.5响应式重构之“版本计数”
前言 Vue3.5响应式重构主要分为两部分:双向链表和版本计数.在上一篇文章中我们讲了 双向链表 ,这篇文章我们接着来讲版本计数. 欧阳年底也要毕业了,加入欧阳的面试交流群(分享内推信息).高质量vu ...
- 条理清晰,浅显易懂:Lua语法基础知识(第二部分)
今天我们继续学习Lua语法基础教程,中篇. 五.变量 5.1 number变量 变量,可以看作是一个桶,在里面装你想要装的内容.这些内容可以是Lua包含的所有合法类型. 例如:我想要新建一个桶,名叫b ...
- 内网IP地址实现HTTPS加密访问教程
一.前期准备 确定内网IP地址: 确保有一个明确且固定的内网IP地址.动态IP地址可能不适合此场景,因为它们会频繁改变,导致SSL证书失效. 选择SSL证书颁发机构(CA): 选择一个受信任的CA,如 ...
- 6、oracle网络(监听)
oracle包含 1.软件 2.数据库 3.实例 4.监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动:数据库启动,监听也可以不启动:数据库启动,监听也启动 监 ...
- k8s之Helm
官方文档: https://helm.sh/zh/docs/intro/using_helm/ Helm 帮助您管理 Kubernetes 应用-- Helm Chart,Helm 是查找.分享和使用 ...
- vue中方法中数据已更新,但是视图却没有变化解决方法
今天在项目中碰到这样一个问题: 从父组件中传过来的props中的数据,在子组件中想加入一个变量.在created中加入变量,在方法中打印次变量是有的,但是当变量发生变化之后,视图中是响应不到的. 解决 ...
- F650A光猫的一些命令(一)
查看有 / # uname -a Linux F650A 4.1.25 #12 SMP Tue Aug 15 21:57:30 CST 2017 armv7l GNU/Linux / # cat /p ...