像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包

文章目录

  • 简介
  • 一、安装工具包
  • 二、实现步骤
    • 1.按照MvvmLight 的结构创建对应文件夹和文件
    • 2.编辑 ViewModelLocator
    • 3.引用全局资源
  • 二、使用详情
    • 1.属性
    • 2.命令
    • 3. 消息通知
    • 4. 完整程序代码展示
  • 运行结果


简介

CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit.Mvvm)是一个现代、快速和模块化的 MVVM 库。 它是 .NET 社区工具包的一部分,围绕以下原则生成:
1、独立于平台和运行时 - .NET Standard 2.0、.NET Standard 2.1 和 .NET 6(与 UI 框架无关)
2、易于选取和使用 - 对应用程序结构或编码范例(“MVVM”之外)没有严格的要求,也就是可以灵活使用。
3、按需取用 - 自由选择要使用的组件。
4、引用实现 - 精简且高效,为基类库中包含的接口提供实现,但缺少直接使用它们所需的具体类型。
MVVM 工具包由 Microsoft 维护和发布,是 .NET Foundation 的一部分。 它还由几个内置于 Windows 的第一方应用程序(如 Microsoft Store)使用。
此包面向 .NET Standard,因此可在任何应用平台上使用:UWP、WinForms、WPF、Xamarin、Uno 等;并且可在任何运行时上使用:.NET Native、.NET Core、.NET Framework 或 Mono。 它在所有这些平台和运行时上都可运行。 API 图面在任何情况下都相同,因此非常适合生成共享库。
此外,MVVM 工具包还有一个 .NET 6 目标,用于在 .NET 6 上运行时实现更多内部优化。 在这两种情况下,公共 API 图面都是相同的,因此 NuGet 将始终解析包的最佳版本,使用者无需担心有哪些 API 可以在其平台上使用的问题。

一、安装工具包

首先创建一个WPF应用程序,这里命名为 CommunityToolkitDemo,目标框架为 .NET Framework 4.6.1 。Microsoft Visual Studio Enterprise 2022 (64 位) - 版本 17.10.4 。创建项目完成后,打开NuGet 包管理器,搜索 CommunityToolkit.Mvvm ,本例安装的是当前最新版 8.2.2 版本。如下所示:
在这里插入图片描述

二、实现步骤

1.按照MvvmLight 的结构创建对应文件夹和文件

创建 ViewModel 文件夹,创建 ViewModelLocator 文件,如下所示:
在这里插入图片描述

2.编辑 ViewModelLocator

代码如下(示例):

 public class ViewModelLocator{public static IServiceProvider ServiceProvide { get; set; }public ViewModelLocator(){ServiceProvide = GetService();}private IServiceProvider GetService(){var service = new ServiceCollection();service.AddSingleton<MainViewModel>();return service.BuildServiceProvider();}public MainViewModel Main{get{return ServiceProvide.GetService<MainViewModel>();}}}

service.AddSingleton(); 每次新的ViewModel 就通过这里进行添加,然后在创建对应的属性名。

public MainViewModel Main{get{return ServiceProvide.GetService<MainViewModel>();}}

3.引用全局资源

在 App.xaml 中将 ViewModel 作为资源添加引用。这里做法与MvvmLight 一致。
在这里插入图片描述
做完以上工作,我们就实现了像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包。

二、使用详情

1.属性

  [ObservableProperty]private string dateTimeStr;public string DateTimeStr{get { return dateTimeStr; }set{SetProperty(ref dateTimeStr, value);}}

2.命令

 public RelayCommand<string> ButtonClickCmd {  get; set; }public MainViewModel(){ButtonClickCmd = new RelayCommand<string>(FunMenu);}public void FunMenu(string p){switch (p){case "最小化":WindowMin();break;case "最大化":WindowMax();break;case "关闭":AppClose();break;case "改变数值":ChangeValue();break;}}

3. 消息通知

在MainViewModel 视图中发送三个消息,分别是窗体关闭、最大化和最小化功能实现。

private void AppClose(){WeakReferenceMessenger.Default.Send("MainWindowClose");}private void WindowMax(){WeakReferenceMessenger.Default.Send("MainWindowMax");}private void WindowMin(){WeakReferenceMessenger.Default.Send("MainWindowMin");}

在 MainWindows 中实现消息的接受与处理

 public MainWindow(){InitializeComponent();//消息注册RegisterMessage();}private void RegisterMessage(){WeakReferenceMessenger.Default.Register<string>(this,HandleMessage);}private void HandleMessage(object recipient, string message){switch (message){case "MainWindowClose":AppClose();break;case "MainWindowMax":MainWindowMax();break;case "MainWindowMin":MainWindowMin();break;}}

4. 完整程序代码展示

项目目录结构:
在这里插入图片描述
1、App.xaml 文件代码如下:

<Application x:Class="CommunityToolkitDemo.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:CommunityToolkitDemo" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"StartupUri="MainWindow.xaml"><Application.Resources><ResourceDictionary><FontFamily x:Key="iconfont">/Assets/Fonts/#iconfont</FontFamily><vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:CommunityToolkitDemo.ViewModel"/><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="/Assets/Styles/CommonStyleDictionary.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>

2、MainWindow.xaml 文件代码如下:

<Window x:Class="CommunityToolkitDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:CommunityToolkitDemo" mc:Ignorable="d"xmlns:viewmodel="clr-namespace:CommunityToolkitDemo.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel:MainViewModel}"DataContext="{Binding Source={StaticResource Locator},Path=Main}"Title="MainWindow" Height="450" Width="800" Background="#2b2b2b" ResizeMode="CanResize"AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen"><Window.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="/Assets/Styles/SystemButton.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Window.Resources><Viewbox x:Name="RootViewbox" Stretch="Fill"><Grid x:Name="MainContent" ClipToBounds="True" Background="Transparent"><Grid.RowDefinitions><RowDefinition Height="40"/><RowDefinition Height="*"/><RowDefinition Height="30"/></Grid.RowDefinitions><!--Grid 没有设置背景则不支持拖拽--><Grid Grid.Row="0"  Background="#1F2336"

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

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

相关文章

学习计算机

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

Programming Studio COSC2803

You must divide the implementation so that each member of the group contributes to every level. iuww520iuww520iuww520iuww520iuww520iuww520iuww520iuww520 Specifically:  Each person must implement one LEVEL 1 (GREEN) sub-task.  Each person must …

[数据集][目标检测]拐杖检测数据集VOC+YOLO格式2778张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2778 标注数量(xml文件个数)&#xff1a;2778 标注数量(txt文件个数)&#xff1a;2778 标注…

【iOS】—— isMemberOfClass isKindOfClass以及源码

【iOS】—— isMemberOfClass & isKindOfClass以及源码 isa指针示例源码解析&#xff1a;isKindOfClass&#xff1a;源码解析&#xff08;实例方法和类方法&#xff09;isMemberOfClass&#xff1a;源码解析&#xff08;实例方法和类方法&#xff09;源码分析总结&#xff…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.3大数据与2.2.4区块链

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

@Configuration的proxyBeanMethods

作用&#xff1a;用于控制配置类的代理行为,确定配置类中的 Bean 方法是否被代理&#xff0c;从而影响 Bean 的创建和管理方式 比较 proxyBeanMethods true 默认行为: 当 proxyBeanMethods 设置为 true&#xff08;默认值&#xff09;时&#xff0c;Spring 会为配置类创建一…

HTML进阶:探索语义化标记与可访问性优化

随着Web技术的不断发展&#xff0c;HTML不再仅仅是用来定义网页内容的标记语言&#xff0c;它还被赋予了更多的责任&#xff0c;如提高网页的可读性、可维护性和可访问性。语义化标记&#xff08;Semantic Markup&#xff09;和可访问性优化&#xff08;Accessibility Optimiza…

航班管理系统【C语言版】单文件编写

开发环境 操作系统&#xff1a;Windows 11专业版开发工具&#xff1a;Visual Studio Code编程语言&#xff1a;C 项目考核验收表 1. 设计目标 本项目的目标是设计并实现一个简易的航班管理系统。该系统应具备以下功能&#xff1a; 添加航班信息查询航班信息显示所有航班信…

自动标签的艺术:sklearn中的聚类标签自动分配技术

自动标签的艺术&#xff1a;sklearn中的聚类标签自动分配技术 在机器学习领域&#xff0c;聚类是一种无监督学习方法&#xff0c;它将数据集中的样本分组&#xff0c;使得同一组内的样本相似度高&#xff0c;而不同组之间的样本相似度低。与有监督学习不同&#xff0c;聚类不依…

前端经验:使用sheetjs导出CSV文本为excel

应用场景 很多web表格组件没有提供直接的导出excel功能&#xff0c;但提供了导出CSV的功能。 如果能想办法拿到CSV的内容&#xff0c;就可以利用sheetjs生成excel并导出。 实施步骤 1.拿到CSV的内容字符 每种表格组件都有各自的CSV生成方法&#xff0c;不管用什么方法&…

[python] 利用opencv显示对比试验效果

利用 opencv 显示 对比实验效果 选择有效区域 import os import random import uuidfrom tqdm import tqdm import cv2 import numpy as np import matplotlib.pyplot as plt GT_Dir"results_compare/GT/" Bicubic_dir"results_compare/Bicubic4x/" Phase…

服务器证书基于 OpenSSL一键颁发脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

vue使用了代理跨域,部署上线,使用Nginx配置出现问题,访问不到后端接口

1、如果路由的mode是history模式的要加上框框里的哪句&#xff0c;然后配置下面的location router location / {root /usr/local/app/dist/; #vue文件dist的完整路径try_files $uri $uri/ router;index index.html index.htm;}#error_page 500 502 503 504 /50x.html;lo…

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点&#xff0c;内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证&#xff0c;作为源自中国、面向全球的专业技能认证&#xff0c;覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业&#xff0c;旨在培养能够胜任数…

RK3328 Debian安装OpenMediaVault

手头有RK3328板卡&#xff0c;自己编译了Debian并烧录跑起来了&#xff0c;拿它来作为NAS使用&#xff0c;在网上找了一些开源的NAS系统&#xff0c;最终敲定使用OpenMediaVault这套&#xff0c;下面是在RK3328 Debian系统下的安装过程&#xff1a; 0、先打开一个Terminal终端…

CVE-2023-33440(任意文件上传)

简介 Faculty Evaluation System v1.0 存在未授权任意文件上传漏洞漏洞 过程 打开靶场 进行目录扫描 发现后台login.php&#xff0c;进入查看 弱口令进行测试&#xff0c;无效&#xff0c;无法进入 根据提示是未授权访问文件上传 &#xff0c;应该是不需要登录就能触发漏洞…

分布式Session共享的5类技术方案,与优劣势比较

分布式Session共享是分布式系统中常见的问题&#xff0c;主要解决在多个服务器之间共享用户会话信息的需求。以下是五种常见的分布式Session共享技术方案及其优劣势比较&#xff1a; 1. Session复制 设计思路&#xff1a; 多个Web服务器之间相互同步Session&#xff0c;每个W…

Apple Vision Pro 开发资源大全

Apple Vision Pro 是一款强大的视觉处理设备,为开发者提供了丰富的应用场景和开发资源。以下是与 Apple Vision Pro 相关的应用程序、开发者资源、社区和文章的集合,旨在帮助开发者更好地利用这一平台。 1. Vision Pro 使用技巧 技巧和窍门:提供一系列实用的使用技巧,帮助…

http 协议中GET如何传递参数(Query String)?

因为项目需要&#xff0c;最近在手搓一个Http Connection&#xff0c;目的是实现最简单的Http访问&#xff0c;能通过Get或则Post方法向数数的日志服务器传递数据。之前看过数数提供的开发包&#xff0c;因为服务器用的是C&#xff0c;而数数提供的C/C开发包简陋的吓人&#xf…

openstack设置IP直接登录,不需要加dashboard后缀

openstack 实验环境&#xff0c;openstack-t版&#xff0c;centos2009 修改配置文件 [rootcontroller ~]# vim /WEBROOT /etc/openstack-dashboard/local_settings #将dashboard去掉 WEBROOT /dashboard/ #改为 WEBROOT /[rootcontroller ~]# vim /etc/httpd/conf.d/openst…