前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WPF开发-MVVM Toolkit框架的使用

WPF开发-MVVM Toolkit框架的使用

作者头像
码客说
发布于 2022-06-12 04:36:36
发布于 2022-06-12 04:36:36
3.3K00
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

前言

官方文档

https://docs.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/

安装

在解决方案资源管理器中,右键单击项目,然后选择“管理NuGet包”。 搜索 Microsoft.Toolkit.Mvvm 并安装它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Install-Package Microsoft.Toolkit.Mvvm -Version 7.1.2

添加 using 指令以使用新 API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Microsoft.Toolkit.Mvvm;

这个包主要提供了如下的

可观察对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserVM : ObservableObject
{
  private string name;

  public string Name
  {
    get => name;
    set => SetProperty(ref name, value);
  }

  private int age;

  public int Age
  {
    get => age;
    set => SetProperty(ref age, value);
  }
}

页面的类中添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class MainWindow : Window
{
  private UserVM userVM = new UserVM();

  public MainWindow()
  {
    InitializeComponent();
    DataContext = userVM;
    Task.Run(() =>
             {
               while (true)
               {
                 userVM.Age += 1;
                 Thread.Sleep(1000);
               }
             });
  }
}

页面中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Grid>
  <StackPanel>
    <TextBlock FontSize="30" Text="{Binding Age}" />
  </StackPanel>
</Grid>

我们就可以看到数字就会一直递增了。

命令

页面中我们添加命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<StackPanel Height="40" Orientation="Horizontal">
  <TextBlock FontSize="30" Text="{Binding Name}" />
  <TextBlock FontSize="30" Text="{Binding Age}" />

  <Button Command="{Binding IncrementAgeCommand}" Content="年龄递增" />
</StackPanel>

对应的ViewModel中添加命令及响应的事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserVM : ObservableObject
{
  private string name;

  public string Name
  {
    get => name;
    set => SetProperty(ref name, value);
  }

  private int age;

  public int Age
  {
    get => age;
    set => SetProperty(ref age, value);
  }

  public ICommand IncrementAgeCommand { get; }
  
  public UserVM()
  {
    IncrementAgeCommand = new RelayCommand(IncrementAge);
  }
  
  private void IncrementAge() => Age++;
}

这样只要我们点击按钮,年龄就会递增1。

消息机制

注册与发送

添加传递消息的类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ZMessage
{
  public int Code { get; set; }

  public string Message { get; set; }

  public ZMessage(int code, string msg)
  {
    Code = code;
    Message = msg;
  }
}

消息接收与发送

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public MainWindow()
{
  InitializeComponent();
  initMessage();
}

private void initMessage()
{
  WeakReferenceMessenger.Default.Register<ZMessage>(
    this,
    (r, m) =>
    {
      Console.WriteLine("接收到信息:" + m.Message);
    }
  );

  WeakReferenceMessenger.Default.Send(new ZMessage(100, "Hello"));
}

可接收消息的类

当然我们也可以让我们的ViewModel接收消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserVM : ObservableRecipient, IRecipient<ZMessage>
{
  private string name;

  public string Name
  {
    get => name;
    set => SetProperty(ref name, value);
  }

  private int age;

  public int Age
  {
    get => age;
    set => SetProperty(ref age, value);
  }

  public UserVM()
  {
    IsActive = true;
  }

  public void Receive(ZMessage message)
  {
    Name = message.Message;
    Age = message.Code;
  }
}

这里一定要注意

  • 要继承ObservableRecipient类,实现IRecipient<>接口。
  • 只有设置IsActive = true;,才能接收消息。

我们还是在页面的类中发送消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WeakReferenceMessenger.Default.Send(new ZMessage(18, "XiaoMing"));

页面也稍做修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<StackPanel Orientation="Horizontal">
  <TextBlock FontSize="30" Text="{Binding Name}" />
  <TextBlock FontSize="30" Text="{Binding Age}" />
</StackPanel>

我们会发现页面上已经变更为我们发送消息的数据了。

控制反转(IOC)

添加依赖库Microsoft.Extensions.DependencyInjection

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Install-Package Microsoft.Extensions.DependencyInjection -Version 6.0.0

创建我们要自动注入的类

加入如下是我们用户相关的服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IUserService
{
  string getUserName();
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserService : IUserService
{
  public string getUserName()
  {
    return "XiaoMing";
  }
}

添加注入的控制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class App : Application
{
  public App()
  {
    Services = ConfigureServices();

    this.InitializeComponent();
  }

  public new static App Current => (App)Application.Current;

  public IServiceProvider Services { get; }

  private static IServiceProvider ConfigureServices()
  {
    var services = new ServiceCollection();

    services.AddSingleton<IUserService, UserService>();

    // ViewModels
    services.AddTransient<UserVM>();

    return services.BuildServiceProvider();
  }
}

其中

  • AddSingleton 单一实例服务
  • AddScoped 范围内的服务
  • AddTransient 暂时性服务

权重:

AddSingletonAddTransientAddScoped

生命周期:

  • AddSingleton 项目启动-项目关闭 相当于静态类 只会有一个 每一次获取的对象都是同一个
  • AddScoped 请求开始-请求结束 在这次请求中获取的对象都是同一个 请求时创建
  • AddTransient 请求获取-(GC回收-主动释放) 获取时创建 每一次获取的对象都不是同一个

注意:

由于AddScoped对象是在请求的时候创建的 所以不能在AddSingleton对象中使用 甚至也不能在AddTransient对象中使用

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private UserVM userVM = (UserVM)App.Current.Services.GetService(typeof(UserVM));
private IUserService userService = (IUserService)App.Current.Services.GetService(typeof(IUserService));

这样是不是感觉还麻烦了

但是如果我们的ViewModel是这样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserVM : ObservableObject
{
  private string name;

  public string Name
  {
    get => name;
    set => SetProperty(ref name, value);
  }

  private int age;

  public int Age
  {
    get => age;
    set => SetProperty(ref age, value);
  }

  public ICommand IncrementAgeCommand { get; }

  public IUserService userService { get; }

  public UserVM(IUserService _userService)
  {
    userService = _userService;
    IncrementAgeCommand = new RelayCommand(IncrementAge);
  }

  private void IncrementAge() => Age++;
}

这里的IUserService的实例并没有传入但是就可以用了,因为IOC框架已经自动注入了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【Spring Boot】018-Swagger
前端伪造后端数据——json,在写前端页面的时候已经存在,不需要后端,前端工程依旧能够跑起来;
訾博ZiBo
2025/01/06
410
【Spring Boot】018-Swagger
spring boot 下swagger2 的使用
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
acc8226
2022/05/17
6670
spring boot 下swagger2 的使用
Spring Boot (七) 集成Swagger
@Api()用于类; 表示标识这个类是swagger的资源 - @ApiOperation()用于方法; 表示一个http请求的操作 - @ApiParam()用于方法,参数,字段说明; 表示对参数的添加元数据(说明或是否必填等) - @ApiModel()用于类 表示对类进行说明,用于参数用实体类接收 - @ApiModelProperty()用于方法,字段 表示对model属性的说明或者数据操作更改 - @ApiIgnore()用于类,方法,方法参数 表示这个方法或者类被忽略 - @ApiImplicitParam() 用于方法 表示单独的请求参数 - @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam
斯文的程序
2019/11/07
6180
spring boot集成swagger构建API文档
使用swagger不用手工写API相关的word文档了,并且还可以使用swagger生成的API文档进行测试,使用起来倍儿爽。接下来咱们就来搞一个demo案例。
田维常
2019/07/16
6530
spring boot集成swagger构建API文档
SpringBoot 通过配置禁用swagger
使用注解@Profile({“dev”,“test”}) 表示在开发或测试环境开启,而在生产关闭。(推荐使用)
用户1212940
2022/04/13
2K0
第九节:SpringBoot在线文档Swagger2入门
Swagger2 是一个开源项目,用于为 RESTful Web 服务生成 REST API 文档。它提供了一个用户界面,可以通过 Web 浏览器访问我们的 RESTful Web 服务,测试接口。 SpringBoot集成Swagger2 3.0以下版本 pom.xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </
入门笔记
2022/02/10
4540
SpringBoot 项目集成Swagger2
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。 作用:
Freedom123
2024/03/29
1090
SpringBoot 项目集成Swagger2
Spring Boot:整合Swagger文档
spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口。这些接口不但会服务于传统的web端(b/s),也会服务于移动端。在实际开发过程中,这些接口还要提供给开发测试进行相关的白盒测试,那么势必存在如何在多人协作中共享和及时更新API开发接口文档的问题。 
朝雨忆轻尘
2019/06/19
9250
Spring Boot:整合Swagger文档
后端:SpringBoot集成Swagger-Bootstrap-UI,界面美观!
SpringBoot集成Swagger-Bootstrap-UI,界面美观。下面给大家介绍一下!
小明互联网技术分享社区
2021/05/14
2K0
后端:SpringBoot集成Swagger-Bootstrap-UI,界面美观!
SpirngBoot整合Swagger
由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。
框架师
2021/03/05
1.2K0
swagger2
Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。
xiaozhangStu
2023/10/19
1860
一文搞懂Swagger,让你明白用了Swagger的好处!!!
前后端分离缺陷 了解Swagger之前,需要先知道什么是前后端分离 现在的时代 SpringBoot + VUE 以前的时代 SSM + JSP模板引擎====>后端程序员 前后端分离时代 通过相关的
框架师
2020/06/16
4.4K2
一文搞懂Swagger,让你明白用了Swagger的好处!!!
前后端分离缺陷 了解Swagger之前,需要先知道什么是前后端分离 现在的时代 SpringBoot + VUE..........等等 以前的时代 SSM + JSP模板引擎====>后端程序员 前
框架师
2020/06/11
6K0
Swagger技术(swagger2/swagger3/knife4j)
接口文档对于前后端开发人员都十分重要。 尤其近几年流行前后端分离后接口文档又变成重中之重。 接口文档固然重要,但是由于项目周期等原因后端人员经常出现无法及时更新, 导致前端人员抱怨接口文档和实际情况不一致。 很多人员会抱怨别人写的接口文档不规范,不及时更新。 当时自己写的时候确实最烦去写接口文档。这种痛苦只有亲身经历才会牢记于心。 如果接口文档可以实时动态生成就不会出现上面问题。 Swagger 可以完美的解决上面的问题。
时间静止不是简史
2022/12/02
2.5K0
Swagger技术(swagger2/swagger3/knife4j)
Spring boot Swagger2 配置使用实战
分析上述配置,我们需要在 java 类上指明 @Configuration、@EnableSwagger2 注解。
create17
2020/06/09
2K0
SpringBoot 集成 Swagger-Bootstrap-UI,页面更清爽!
之前在创业公司待的时候,用过swagger,因为我第一天来这家公司工作,第一个任务就是做接口文档自动化。
猿天地
2020/12/03
7520
SpringBoot 集成 Swagger-Bootstrap-UI,页面更清爽!
springboot 之集成Swagger2
一直没机会做spring生态圈的框架,公司选择的是一些小众的微服务,鉴于此考虑,丰富自己的技术栈,花了两天时间从网上各网站上学习了springboot一些基础知识。 本章只介绍springboot微服务集成swagger2,用于后端工程师开发过程中调试接口。
felixxue
2022/12/30
3140
springboot 之集成Swagger2
SpringBoot 中如何使用SwaggerAPI接口文档?
随着互联网技术的不断发展,网站项目架构基本都是前后端分离了,原来需要后端渲染数据展示,现在只需要提供Restful风格的Api接口给前端或移动端。这样API文档便成为了前后端开发人员联系的纽带。这就引入了一个新的问题:如何提供一个灵活高质量的API文档给多个开发人员或者团队?
AI码真香
2022/09/13
1.6K0
SpringBoot 中如何使用SwaggerAPI接口文档?
Spring+SpringMVC+Mybatis(开发必备技能)03、swagger(api接口开发必备,view视图略过)
配套源码(初学者可下载有用):https://download.csdn.net/download/feng8403000/85483308
红目香薰
2022/11/30
2600
Spring+SpringMVC+Mybatis(开发必备技能)03、swagger(api接口开发必备,view视图略过)
集成Swagger 学习
产生的问题 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
默 语
2024/11/20
920
集成Swagger 学习
推荐阅读
相关推荐
【Spring Boot】018-Swagger
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档