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等平台上使用。
  • 易于选取和使用:对应用程序结构或编码范例没有严格需求,可以灵活使用。
  • 按需取用:自由选择要使用的组件,所有类型都是松散耦合的。
  • 引用实现:为基类库中包含的接口提供实现,但缺少直接使用它们所需的具体类型。

用法

  1. 安装:在Visual Studio中,通过NuGet包管理器搜索并安装CommunityToolkit.Mvvm包,
  2. 引用:在项目中添加using CommunityToolkit.Mvvm;来使用新API。
  3. 实现MVVM:通过继承ObservableObject来创建ViewModel,利用SetProperty方法实现属性变更通知,以及使用RelayCommandAsyncRelayCommand来实现命令模式。

功能

该库提供了一些基础类和接口的实现,主要包括:

  • ObservableObject 和 ObservableRecipient:这些类实现了INotifyPropertyChanged接口,并提供了SetProperty方法,可以在属性值改变时触发PropertyChanged事件,简化数据绑定。
  • ICommand接口的实现,如RelayCommandAsyncRelayCommand:这些类可以帮助创建命令,命令是MVVM模式中的一个重要组成部分。
  • IMessenger和相关消息传递机制,如WeakReferenceMessengerStrongReferenceMessenger,用于组件间的松散耦合通信。

CommunityToolkit.Mvvm 包含的类型主要分为以下几个部分:

  1. CommunityToolkit.Mvvm.ComponentModel
    • ObservableObject:实现了 INotifyPropertyChanged 接口,用于创建响应属性变化的ViewModel。
    • ObservableRecipient:用于消息传递的基类。
    • ObservableValidator:用于数据验证的基类。
  2. CommunityToolkit.Mvvm.DependencyInjection
    • Ioc:提供依赖注入的容器和相关服务。
  3. CommunityToolkit.Mvvm.Input
    • RelayCommand:一个简单的命令实现,用于执行无参方法。
    • RelayCommand<T>:一个泛型版本的 RelayCommand,用于执行带参方法。
    • AsyncRelayCommand:一个异步命令实现,用于执行异步无参方法。
    • AsyncRelayCommand<T>:一个异步命令实现,用于执行异步带参方法。
    • IRelayCommandRelayCommand 的接口定义。
    • IRelayCommand<T>RelayCommand<T> 的接口定义。
    • IAsyncRelayCommandAsyncRelayCommand 的接口定义。
    • IAsyncRelayCommand<T>AsyncRelayCommand<T> 的接口定义。
  4. CommunityToolkit.Mvvm.Messaging
    • IMessenger:消息传递接口,定义了消息发送和订阅的方法。
    • WeakReferenceMessenger:一个使用弱引用的消息传递类,用于避免内存泄漏。
    • StrongReferenceMessenger:一个使用强引用的消息传递类。
    • IRecipient<TMessage>:消息接收者接口,用于接收特定类型的消息。
    • MessageHandler<TRecipient, TMessage>:消息处理程序,用于处理特定类型的消息。
  5. CommunityToolkit.Mvvm.Messaging.Messages
    • PropertyChangedMessage<T>:用于属性变化的消息。
    • RequestMessage<T>:用于请求特定类型响应的消息。
    • AsyncRequestMessage<T>:异步版本的 RequestMessage<T>
    • CollectionRequestMessage<T>:用于集合操作的请求消息。
    • AsyncCollectionRequestMessage<T>:异步版本的 CollectionRequestMessage<T>
    • ValueChangedMessage<T>:用于值变化的消息。

CommunityToolkit.Mvvm 还提供了一些关键属性和功能

  1. 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);}
      }
  2. [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);
      }
  3. [RelayCommand] 属性
    • [RelayCommand] 是一个特性,用于创建命令。命令是 MVVM 模式中的一个重要组成部分,用于将 View 的行为(如按钮点击)绑定到 ViewModel 中的方法。
    • 用法:在 ViewModel 中的方法上使用 [RelayCommand] 特性。
    • 示例代码
      public partial class MyViewModel : ObservableObject
      {[RelayCommand]private void ExecuteCommand(){// Command execution logic here}
      }
      这将生成一个 ICommand 实现,可以被 View 绑定。
其他属性
  1. RelayCommandAsyncRelayCommand

    • 这些类实现了 ICommand 接口,用于创建命令,是 MVVM 模式中命令模式的实现。
  2. IMessenger

    • 消息传递接口,用于在不同的 ViewModel 或 View 之间传递消息,实现组件间的松散耦合通信。
  3. PropertyChangedMessage<T>

    • 用于属性变化的消息,是 IMessenger 接口实现中用于传递属性变更通知的一种消息类型。
  4. RequestMessage<T>AsyncRequestMessage<T>

    • 用于请求特定类型响应的消息,其中 AsyncRequestMessage<T> 是异步版本的请求消息。
  5. CollectionRequestMessage<T>AsyncCollectionRequestMessage<T>

    • 用于集合操作的请求消息,其中 AsyncCollectionRequestMessage<T> 是异步版本的集合请求消息。
  6. ValueChangedMessage<T>

    • 用于值变化的消息,是 IMessenger 接口实现中用于传递值变更通知的一种消息类型。

CommunityToolkit.Mvvm 的框架类 

  1. CommunityToolkit.Mvvm.ComponentModel
    • ObservableObject:实现了 INotifyPropertyChanged 和 INotifyPropertyChanging 接口,用于创建响应属性变化的 ViewModel。
    • ObservableRecipient:用于消息传递的基类。
    • ObservableValidator:用于数据验证的基类。
  2. CommunityToolkit.Mvvm.DependencyInjection
    • Ioc:提供依赖注入的容器和相关服务。
  3. CommunityToolkit.Mvvm.Input
    • RelayCommand:一个简单的命令实现,用于执行无参方法。
    • RelayCommand<T>:一个泛型版本的 RelayCommand,用于执行带参方法。
    • AsyncRelayCommand:一个异步命令实现,用于执行异步无参方法。
    • AsyncRelayCommand<T>:一个异步命令实现,用于执行异步带参方法。
    • IRelayCommandRelayCommand 的接口定义。
    • IRelayCommand<T>RelayCommand<T> 的接口定义。
    • IAsyncRelayCommandAsyncRelayCommand 的接口定义。
    • IAsyncRelayCommand<T>AsyncRelayCommand<T> 的接口定义。
  4. CommunityToolkit.Mvvm.Messaging
    • IMessenger:消息传递接口,定义了消息发送和订阅的方法。
    • WeakReferenceMessenger:一个使用弱引用的消息传递类,用于避免内存泄漏。
    • StrongReferenceMessenger:一个使用强引用的消息传递类。
    • IRecipient<TMessage>:消息接收者接口,用于接收特定类型的消息。
    • MessageHandler<TRecipient, TMessage>:消息处理程序,用于处理特定类型的消息。
  5. CommunityToolkit.Mvvm.Messaging.Messages
    • PropertyChangedMessage<T>:用于属性变化的消息。
    • RequestMessage<T>:用于请求特定类型响应的消息。
    • AsyncRequestMessage<T>:异步版本的 RequestMessage<T>
    • CollectionRequestMessage<T>:用于集合操作的请求消息。
    • AsyncCollectionRequestMessage<T>:异步版本的 CollectionRequestMessage<T>
    • ValueChangedMessage<T>:用于值变化的消息。

CommunityToolkit.Mvvm是一个现代、快速和模块化的MVVM库,它提供了尽可能大的灵活性,让开发人员可以自由选择要使用的组件,以最符合需求的方式组合这些生成块。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…

让Git走代理

有时候idea提交代码或者从github拉取代码&#xff0c;一直报错超时或者:Recv failure: Connection was reset,下面记录一下怎么让git走代理从而访问到github。 1.打开梯子 2.打开网络和Internet设置 3.设置代理 记住这个地址和端口 4.打开git bash终端 输入以下内容 git c…

vivo 游戏中心包体积优化方案与实践

作者&#xff1a;来自 vivo 互联网大前端团队- Ke Jie 介绍 App 包体积优化的必要性&#xff0c;游戏中心 App 在实际优化过程中的有效措施&#xff0c;包括一些优化建议以及优化思路。 一、包体积优化的必要性 安装包大小与下载转化率的关系大致是成反比的&#xff0c;即安装…

Leetcode 每日一题 125.验证回文串

问题定义 给定一个字符串s&#xff0c;我们需要判断它是否是一个回文串。但在此之前&#xff0c;我们需要将所有大写字符转换为小写字符&#xff0c;并移除所有非字母数字字符。只有经过这样处理后的字符串&#xff0c;我们才进行回文检测。 示例解析 以下是几个示例&#x…

Struts扫盲

Struts扫盲 这里的struts是struts1。以本文记录我的那些复习JavaEE的痛苦并快乐的晚上 Struts是什么 框架的概念想必大家都清楚&#xff0c;框架即“半成品代码”&#xff0c;是为了简化开发而设计的。一个项目有许多分层&#xff0c;拿一个MVC架构的Web应用来说&#xff0c;有…

【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

时序预测 | 改进图卷积+informer时间序列预测,pytorch架构

时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构 目录 时序预测 | 改进图卷积informer时间序列预测&#xff0c;pytorch架构预测效果基本介绍参考资料 预测效果 基本介绍 改进图卷积informer时间序列预测代码 CTR-GC卷积,informer&#xff0c;CTR-GC 图卷积…

从入门到精通:一文掌握 Dockerfile 的用法!(多阶段构建与缓存优化)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Dockerfile基础用法 📒📝 什么是 Dockerfile?📝 Dockerfile 的常见指令🔖 构建指令🔖 命令指令🎈 完整示例:构建一个 Python Flask 应用🔖 1. 项目结构🔖 2. 编写 Dockerfile🔖 3. 构建和运行 Docker 镜像�…

Android11 修改系统语言

1.定义一个view <RelativeLayoutandroid:id"id/rlChooseLanguage"style"style/SettingAboutItem"><TextViewstyle"style/SettingAboutItemTextView"android:text"string/choose_language" /><ImageView style"st…

【C语言】数据库分库分表

你如何理解数据库分库分表&#xff1f;请谈谈在实际项目中如何实现分库分表。 数据库分库分表是一种数据库优化策略&#xff0c;用于处理大规模数据存储和高并发访问带来的性能挑战。它的核心思想是将单个大数据库拆分成多个小的、独立的数据库&#xff08;分库&#xff09;&am…

Go语言开发基于SQLite数据库实现用户表修改接口(四)

背景 上一章 Go语言开发基于SQLite数据库实现用户表查询详情接口(三) 这一章我们实现用户表的修改接口 代码实现 mapper层 type UserMapper interface {UpdateById(user *model.User, id uint64) error}type userMapper struct { }func (m *userMapper) UpdateById(user *m…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

844.比较含退格的字符串

java用 O&#xff08;1&#xff09;空间这个方法&#xff0c;容易挺多bug的… O&#xff08;1&#xff09;空间 #&#xff1a;删除前一个字符 》 从后面开始判断&#xff08;这样可以用跳过的思想&#xff09;不能使用两次 i- - 来处理 # 的操作&#xff0c;会造成误删了前面…

大数据实训室建设的必要性

一、大数据发展的背景 大数据作为当今信息技术领域的核心驱动力&#xff0c;正在深刻地改变着社会的各个方面。它不仅仅是指数据量庞大&#xff0c;更重要的是指数据的多样性、实时性和复杂性。随着云计算、物联网等技术的迅猛发展&#xff0c;大数据已成为推动经济社会发展的…

数据结构------队列(Java语言描述)

一、队列的概念 队列是一种数据结构&#xff0c;它遵循先进先出的原则。就像排队买东西一样&#xff0c;先到的人先得到服务&#xff0c;先进入队列的数据元素先被取出。例如&#xff0c;在一个银行排队系统中&#xff0c;顾客按照到达的先后顺序排队等待办理业务。第一个进入…

SD外向交货单

1、写在前面 1.1、文档说明 本文档将介绍外向交货单的创建、修改、删除、过账以及冲销&#xff0c;并且包含如何使用代码来实现上述过程。另外&#xff0c;还将介绍衍生出的交货单屏幕增强和BAPI维护扩展字段等内容。 1.2、关于外向交货单 在 SAP系统中&#xff0c;外向交货…

请解释Python中的装饰器是什么?如何使用它们?

1、请解释Python中的装饰器是什么&#xff1f;如何使用它们&#xff1f; 在Python中&#xff0c;装饰器是一个接受一个函数作为参数的可调用对象&#xff08;通常是一个函数&#xff09;。装饰器本质上是一个高阶函数&#xff0c;因为它接受一个函数作为参数并返回一个新的函数…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能&#xff0c;如果要实现复杂的 SQL 功能&#xff0c;还是建议使用 XML 来配置映射语句&#xff0c;将 SQL 语句写在 XML 配置文件中 如果要操作数据库&#xff0c;需要做以下的配置&#xff0c;与注解…