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环境…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
