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环境…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
