WPF中MVVM工具包 CommunityToolkit.Mvvm
CommunityToolkit.Mvvm
,也称为MVVM工具包,是Microsoft Community Toolkit的一部分。它是一个轻量级但功能强大的MVVM(Model-View-ViewModel)库,旨在帮助开发者更容易地实现MVVM设计模式。
特点
- 独立于平台和运行时:支持.NET Standard 2.0、.NET Standard 2.1 和 .NET 6,与UI框架无关,可在UWP、WinForms、WPF、Xamarin、Uno等平台上使用。
- 易于选取和使用:对应用程序结构或编码范例没有严格需求,可以灵活使用。
- 按需取用:自由选择要使用的组件,所有类型都是松散耦合的。
- 引用实现:为基类库中包含的接口提供实现,但缺少直接使用它们所需的具体类型。
用法
- 安装:在Visual Studio中,通过NuGet包管理器搜索并安装
CommunityToolkit.Mvvm
包, - 引用:在项目中添加
using CommunityToolkit.Mvvm;
来使用新API。 - 实现MVVM:通过继承
ObservableObject
来创建ViewModel,利用SetProperty
方法实现属性变更通知,以及使用RelayCommand
或AsyncRelayCommand
来实现命令模式。
功能
该库提供了一些基础类和接口的实现,主要包括:
- ObservableObject 和 ObservableRecipient:这些类实现了
INotifyPropertyChanged
接口,并提供了SetProperty
方法,可以在属性值改变时触发PropertyChanged
事件,简化数据绑定。 - ICommand接口的实现,如RelayCommand和AsyncRelayCommand:这些类可以帮助创建命令,命令是MVVM模式中的一个重要组成部分。
- IMessenger和相关消息传递机制,如WeakReferenceMessenger和StrongReferenceMessenger,用于组件间的松散耦合通信。
CommunityToolkit.Mvvm
包含的类型主要分为以下几个部分:
-
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:实现了INotifyPropertyChanged
接口,用于创建响应属性变化的ViewModel。ObservableRecipient
:用于消息传递的基类。ObservableValidator
:用于数据验证的基类。
-
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依赖注入的容器和相关服务。
-
CommunityToolkit.Mvvm.Input
RelayCommand
:一个简单的命令实现,用于执行无参方法。RelayCommand<T>
:一个泛型版本的RelayCommand
,用于执行带参方法。AsyncRelayCommand
:一个异步命令实现,用于执行异步无参方法。AsyncRelayCommand<T>
:一个异步命令实现,用于执行异步带参方法。IRelayCommand
:RelayCommand
的接口定义。IRelayCommand<T>
:RelayCommand<T>
的接口定义。IAsyncRelayCommand
:AsyncRelayCommand
的接口定义。IAsyncRelayCommand<T>
:AsyncRelayCommand<T>
的接口定义。
-
CommunityToolkit.Mvvm.Messaging
IMessenger
:消息传递接口,定义了消息发送和订阅的方法。WeakReferenceMessenger
:一个使用弱引用的消息传递类,用于避免内存泄漏。StrongReferenceMessenger
:一个使用强引用的消息传递类。IRecipient<TMessage>
:消息接收者接口,用于接收特定类型的消息。MessageHandler<TRecipient, TMessage>
:消息处理程序,用于处理特定类型的消息。
-
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于属性变化的消息。RequestMessage<T>
:用于请求特定类型响应的消息。AsyncRequestMessage<T>
:异步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的请求消息。AsyncCollectionRequestMessage<T>
:异步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值变化的消息。
CommunityToolkit.Mvvm
还提供了一些关键属性和功能
-
ObservableObject
ObservableObject
是CommunityToolkit.Mvvm
库中的一个基础类,它实现了INotifyPropertyChanged
接口。这个接口是 .NET 数据绑定基础架构的一部分,当对象的一个属性改变时,它会通知绑定到该属性的任何元素。- 用法:ViewModel 通常会继承自
ObservableObject
类。 - 示例代码:
public class MyViewModel : ObservableObject {private string _myProperty;public string MyProperty{get => _myProperty;set => SetProperty(ref _myProperty, value);} }
-
[ObservableProperty] 属性
[ObservableProperty]
是一个特性(Attribute),用于自动生成可观察属性的 getter 和 setter,这些属性会在值改变时触发PropertyChanged
事件。- 用法:直接在 ViewModel 的属性上使用
[ObservableProperty]
特性。 - 示例代码:
这将生成一个类似下面的可观察属性:public partial class MyViewModel : ObservableObject {[ObservableProperty]private string? _name; }
public string? Name {get => _name;set => SetProperty(ref _name, value); }
-
[RelayCommand] 属性
[RelayCommand]
是一个特性,用于创建命令。命令是 MVVM 模式中的一个重要组成部分,用于将 View 的行为(如按钮点击)绑定到 ViewModel 中的方法。- 用法:在 ViewModel 中的方法上使用
[RelayCommand]
特性。 - 示例代码:
这将生成一个public partial class MyViewModel : ObservableObject {[RelayCommand]private void ExecuteCommand(){// Command execution logic here} }
ICommand
实现,可以被 View 绑定。
其他属性
-
RelayCommand 和 AsyncRelayCommand:
- 这些类实现了
ICommand
接口,用于创建命令,是 MVVM 模式中命令模式的实现。
- 这些类实现了
-
IMessenger:
- 消息传递接口,用于在不同的 ViewModel 或 View 之间传递消息,实现组件间的松散耦合通信。
-
PropertyChangedMessage<T>:
- 用于属性变化的消息,是
IMessenger
接口实现中用于传递属性变更通知的一种消息类型。
- 用于属性变化的消息,是
-
RequestMessage<T> 和 AsyncRequestMessage<T>:
- 用于请求特定类型响应的消息,其中
AsyncRequestMessage<T>
是异步版本的请求消息。
- 用于请求特定类型响应的消息,其中
-
CollectionRequestMessage<T> 和 AsyncCollectionRequestMessage<T>:
- 用于集合操作的请求消息,其中
AsyncCollectionRequestMessage<T>
是异步版本的集合请求消息。
- 用于集合操作的请求消息,其中
-
ValueChangedMessage<T>:
- 用于值变化的消息,是
IMessenger
接口实现中用于传递值变更通知的一种消息类型。
- 用于值变化的消息,是
CommunityToolkit.Mvvm
的框架类
-
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:实现了INotifyPropertyChanged
和INotifyPropertyChanging
接口,用于创建响应属性变化的 ViewModel。ObservableRecipient
:用于消息传递的基类。ObservableValidator
:用于数据验证的基类。
-
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依赖注入的容器和相关服务。
-
CommunityToolkit.Mvvm.Input
RelayCommand
:一个简单的命令实现,用于执行无参方法。RelayCommand<T>
:一个泛型版本的RelayCommand
,用于执行带参方法。AsyncRelayCommand
:一个异步命令实现,用于执行异步无参方法。AsyncRelayCommand<T>
:一个异步命令实现,用于执行异步带参方法。IRelayCommand
:RelayCommand
的接口定义。IRelayCommand<T>
:RelayCommand<T>
的接口定义。IAsyncRelayCommand
:AsyncRelayCommand
的接口定义。IAsyncRelayCommand<T>
:AsyncRelayCommand<T>
的接口定义。
-
CommunityToolkit.Mvvm.Messaging
IMessenger
:消息传递接口,定义了消息发送和订阅的方法。WeakReferenceMessenger
:一个使用弱引用的消息传递类,用于避免内存泄漏。StrongReferenceMessenger
:一个使用强引用的消息传递类。IRecipient<TMessage>
:消息接收者接口,用于接收特定类型的消息。MessageHandler<TRecipient, TMessage>
:消息处理程序,用于处理特定类型的消息。
-
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于属性变化的消息。RequestMessage<T>
:用于请求特定类型响应的消息。AsyncRequestMessage<T>
:异步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的请求消息。AsyncCollectionRequestMessage<T>
:异步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值变化的消息。
CommunityToolkit.Mvvm
是一个现代、快速和模块化的MVVM库,它提供了尽可能大的灵活性,让开发人员可以自由选择要使用的组件,以最符合需求的方式组合这些生成块。
相关文章:
WPF中MVVM工具包 CommunityToolkit.Mvvm
CommunityToolkit.Mvvm,也称为MVVM工具包,是Microsoft Community Toolkit的一部分。它是一个轻量级但功能强大的MVVM(Model-View-ViewModel)库,旨在帮助开发者更容易地实现MVVM设计模式。 特点 独立于平台和运行时&a…...

学习空闲任务函数
一、user_StopEnterTask 停止 进入任务 /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_MPUCheckTask.h"#include "ui.h" #include "ui_Hom…...

Hyper-v中ubuntu与windows文件共享
Hyper-v中ubuntu与windows文件共享 前言相关链接第一步--第一个链接第二步--第二个链接测试与验证 前言 关于Hyper-V的共享我搞了好久,网上的很多教程太过冗余,我直接采用最简单的办法吧 相关链接 Hyper-V中Ubuntu 同windows系统共享文件夹-百度经验 …...

【软件工程】一篇入门UML建模图(类图)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...

Windows 安装Docker For Desktop概要
Windows 安装docker 下载部分的工作需要使用科学技术。如果没有可以联系博主发送已下载好的文件。 本文档不涉及技术的讲解,仅有安装的步骤。 准备工作 包含下载与环境准备,下载的文件仅下载,在后续步骤进行安装。 微软关于wsl的文档&…...
解决循环依赖报错问题
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘asyncTaskServiceImpl’: Bean with name ‘asyncTaskServiceImpl’ has been injected into other beans [resignServiceImpl] in its raw version as part…...

代码随想录第46期 单调栈
这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…...

中仕公考怎么样?事业编面试不去有影响吗?
事业编考试笔试已经通过,但是面试不去参加会有影响吗? 1. 自动放弃面试资格:未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题:面试作为招聘流程的关键步骤,无故缺席可能被解释为诚信…...

OMV7 树莓派 tf卡安装
升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置࿰…...
Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
作为一个真正能用的企业级应用,怎么能缺少RESTful接口呢?所以我们需要尝试在Go语言环境中写出我们的对外接口,这样前端就可以借由Gin框架访问我们数据库中的数据了。 一、Gin框架的使用 1. 安装 Gin 首先,你需要在你的 Go 项目…...
【汇编】c++游戏开发
由一起学编程创作的‘C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~’: C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~_射击c-CSDN博客文章浏览…...

Android Studio | 修改镜像地址为阿里云镜像地址,启动App
在项目文件的目录下的 settings.gradle.kts 中修改配置,配置中包含插件和依赖项 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urlu…...

Rocky linux8 安装php8.0
Rocky linux8 安装php8.0 1.安装remi源2.列出php版本3.变更php版本,Rocky8有提供php8版本,所以切换Rocky8提供的版本,而不是remi提供的版本,不过remi有提供php8.1和php8.2版本。4.切换成remi提供的8.0版本5.安装phpendl 1.安装rem…...

Ubuntu 18 EDK2 环境编译
视频:在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始:git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块:git submodule update --init ,然后:make -C BaseTools/ 问题1&a…...

C语言项⽬实践-贪吃蛇
目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…...

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
近日,贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判,判处其死刑,剥夺政治权利终身,并处没收个人全部财产。这一判决不仅彰显了法律的威严,也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…...

Spring:IoC/DI加载properties文件
Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置(Spring:IOC/DI配置管理第三方bean),但是其中包含了一些问题,我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素…...

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…...

深挖C++赋值
详解赋值 const int a 10; int b a;&a 0x000000b7c6afef34 {56496} &a 0x000000b7c6afef34 {10} 3. &b 0x000000b7c6afef54 {10} 总结: int a 10 是指在内存中(栈)中创建一个int (4 byte)大小的空间…...

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
软件介绍 下载iOS旧版应用,简化繁琐的抓包流程。 一键生成去更新IPA(手机安装后,去除App Store的更新检测)。 软件界面 支持系统 Windows 10/Windows 8/Windows 7(由于使用了Fiddler库,因此需要.Net环境…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...