背景

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

  1. 在项目根目录新建 .template.config 文件夹
  2. 文件夹里新建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
}
  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

WPF使用Microsoft.Toolkit.Mvvm作为Mvvm框架DryIoc作依赖注入的更多相关文章

  1. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  2. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...

  3. Spring框架学习之依赖注入

    Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...

  4. 从零写Java Web框架——实现Ioc依赖注入

    大概思路 通过读取配置文件,获取框架要加载的包路径:base-package,类似于 Spring 配置文件中的: <context:component-scan base-package=&q ...

  5. 手写web框架之实现依赖注入功能

    我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...

  6. Spring框架中的依赖注入

    依赖注入(DI : Dependency Injection)是基于.xml配置文件内节点的书写. 注入类型: 1.设置注入,调用了Bean的setXXX()进行值注入 普通属性(value值表示要显 ...

  7. 使用 .NETCore自带框架快速实现依赖注入

    Startup 在Startup的ConfigureServices()中配置DI的接口与其实现 public void ConfigureServices(IServiceCollection se ...

  8. ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  9. 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

    3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...

  10. 类比Spring框架来实现OC中的依赖注入

    如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...

随机推荐

  1. 带你了解nginx功能

    关于Nginx 简介 功能 基本的HTTP服务器功能 其他HTTP服务器功能 邮件代理服务器功能 TCP / UDP代理服务器功能 架构和可扩展性 适用平台 简介 Nginx (engine x) 是 ...

  2. Octave 安装教程

    Octave 用心写著. Octave为GNU项目下的开源软件.同时它也是一种语言,专注于解决线性计算问题.因为对于矩阵计算的优化,使得其速度远高于循环计算.语法兼容Linux shell. Octa ...

  3. redis配置文件剖析

    解析配置文件 #是否在后台运行:no:不是后台运行 daemonize yes #是否开启保护模式,默认开启.要是配置里没有指定bind和密码.开启该参数后,redis只会本地进行访问,拒绝外部访问. ...

  4. [网鼎杯 2020 朱雀组]phpweb

    打开靶机,抓包分析,获得连个关键参数func和p,根据初始页面提示了解连个参数大概是功能和功能参数 测试func=system&p=ls提示hacker..说明有检测过滤 那么我们先读取源码看 ...

  5. 如何在国内使用gcr.io镜像进行拉取

    [root@k8scloude2 ~]# docker pull gcr.io/google-samples/microservices-demo/emailservice:v0.4.0 换成 [ro ...

  6. c++11多线程入门<学习记录>

    最近学习了c++多线程相关知识,也算是对这方面内容的入门 视频链接c++11并发与多线程视频课程 看了大概两周,简单进行总结 参考文章C++11并发与多线程 PS:c++11提供了标准的可跨平台的线程 ...

  7. 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number)。 给定一个整数 x, 如果 x 是哈沙德数,则返回

    2024-11-16:哈沙德数.用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number). 给定一个整数 x, 如果 x 是哈沙德数,则返回 ...

  8. Firefox无需第三方插件在关闭最后一个标签后也不退出程序

    about:config 输入lasttab 变成false

  9. JVM性能优化, Part 3 —— 垃圾回收

    ImportNew注:本文是JVM性能优化 系列-第3篇-<JVM性能优化, Part 3 -- 垃圾回收> 第一篇 <JVM性能优化, Part 1 ―― JVM简介 > 第 ...

  10. 一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia

    前言 最近发现DotNetGuide技术社区交流群有不少小伙伴在学习Avalonia,今天大姚给大家分享一款开源.免费.美观的 Avalonia UI 原生控件库:Semi Avalonia. Ava ...