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.xdnf.cn/news/12353.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。&#xff08;没了解过docker逃逸的朋友也可以看懂&#xff0c;毕竟有了root权限后&a…

福昕阅读器高级版解决文件上传IEEE PDF eXpress字体未嵌入

文件上传IEEE PDF eXpress字体未嵌入问题 Errors: Font Arial-BoldMT, Arial-ItalicMT, ArialMT is not embedded (93x on pages 2-3,5) 因为没安装adobe&#xff0c;尝试使用福昕阅读器高级版解决&#xff08;学校统一买的&#xff0c;不知道普通版行不行&#xff09; 找到潜…

人工智能在智能家居的应用

AI 在智能家居场景中&#xff0c;一方面将进一步推动家居生活产品的智能化&#xff0c;包 括照明系统、音箱系统、能源管理系统、安防系统等&#xff0c;实现家居产品从感知到认知再到决策的 发展&#xff1b;另一方面在于智能家居系统的建立&#xff0c;搭载人工智能的多款产品…

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…

蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】

目录 1&#xff1a;HAA9809特性 2&#xff1a;典型应用电路 3&#xff1a;CTRL管脚控制信息 4&#xff1a;一线脉冲控制方式 5&#xff1a;输入电阻&#xff0c;调节放大增益 6&#xff1a;输入电容&#xff0c;调节频响 7&#xff1a;总结 矽源特ChipSourceTek-HAA9809…

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来&#xff0c;市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时&#xff0c;也不可避免地面临着安全挑战。AI安全&#xff0c;即人工智能安全&#xff0c;涉及在人工智能系统的开发、部署和使用全过…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据&#xff1f; 面向高并发如何提高活动查询性能&#xff1f; 如何保证缓存一致性&#xff1f; 数据流 Redis数据结构设计 如…

餐饮点餐系统(2)

今天我们继续完成我们的项目&#xff0c;本次的目标是为每一个分支选项&#xff0c;创建菜单。 分析&#xff1a;1.首先我们要为每一个分支选项创建一个函数 2.其次是调用我们创建的函数 3.最后创建的自定义函数中会用到&#xff0c;while语句&#xff0c;switch语句&#xff…

某军工变压器企业:通过集团级工业IOT平台,实现数字化转型

概述 近年来&#xff0c;随着全球电力需求的增长和智能电网的推进&#xff0c;变压器市场规模持续扩大。2023年&#xff0c;全球配电变压器市场规模达到143.21亿美元&#xff0c;同比增长8.12%。中国配电变压器市场规模在2023年达到194.35亿元&#xff0c;同比增长14.53%‌。此…

caozha-CEPCS(新冠肺炎疫情防控系统)

caozha-CEPCS&#xff0c;是一个基于PHP开发的新冠肺炎疫情防控系统&#xff0c;CEPCS&#xff08;全称&#xff1a;COVID-19 Epidemic Prevention and Control System&#xff09;&#xff0c;可以应用于单位、企业、学校、工业园区、村落等等。小小系统&#xff0c;希望能为大…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><center><h3>简单水平菜单导航栏</h3></center><hr /><nav><ul&g…

《青牛科技GC6150:摇头机驱动芯片的卓越替代品,超越 TMI8150》

在终端工程师们精心打造的科技世界里&#xff0c;摇头机的性能优化一直是关注焦点。今天&#xff0c;我们要向各位终端工程师介绍一款具有革命性的驱动芯片 —— 芯麦 GC6150&#xff0c;它宛如一颗耀眼的明星&#xff0c;在摇头机驱动领域绽放光芒&#xff0c;并且能够完美替代…

C++转义序列

\b \b是一个退格符&#xff08;backspace character&#xff09;&#xff0c;它的作用是将光标向左移动一个位置&#xff0c;但并不会删除光标位置上的字符。这个行为在某些情况下可能会导致视觉上的字符“消失”&#xff0c;但实际上这些字符仍然存在于输出缓冲区中&#xf…

Chrome DevTools Protocol 入门:快速开始

Chrome DevTools Protocol&#xff08;CDP&#xff09; 是一套开放协议&#xff0c;允许外部程序通过 Chrome 浏览器提供的接口与其进行交互。CDP 提供了丰富的功能&#xff0c;使开发者可以远程控制 Chrome 浏览器&#xff0c;包括操作 DOM、监控网络请求、调试代码、截取屏幕…

TCP协议详解

一、整体抓包情况 192.168.111.1:53965请求向192.168.111.128:80发起TCP连接。 注意&#xff1a;TCP连接是TCP端口向TCP端口的连接。 二、TCP连接请求&#xff08;三次握手&#xff09; 此处为简洁隐去端口号。 &#xff08;1&#xff09;192.168.111.1——>192.168.11…

vue+Springboot实现简单文件上传到本地

实现效果 点击上传文件按钮后&#xff0c;选择需要上传的文件&#xff0c;如果是图片的话&#xff0c;上传成功后可以直接在下面预览。 前端页面 <template><div class"file-upload"><el-upload:headers"getUploadConfig(token).headers"…

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…