WPF -- MVVM框架 - CommunityToolkit.Mvvm
目录
1. 简介
2. Nuget安装
3. 开发环境
4. 属性通知
5. 命令
5.1 RelayCommand
5.2 AsyncRelayCommand
6. Messenger
7. Ioc
8. 其他
8.1 global using
8.2 函数参数null检查
1. 简介
包 CommunityToolkit.Mvvm
(名为 MVVM 工具包) 是一个现代、快速和模块化的 MVVM 库。 它是 Windows 社区工具包的一部分。
MVVM 工具包由 Microsoft 维护和发布,也是 .NET Foundation 的一部分。
MVVM 工具包还具有 .NET 6 目标,用于在 .NET 6 上运行时启用更多内部优化。
2. Nuget安装
3. 开发环境
VS2022
WPF应用程序
.NET6.0
4. 属性通知
添加引用 using CommunityToolkit.Mvvm.ComponentModel;
//viewModel继承ObservableObjectpublic class ViewAViewModel:ObservableObject{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value);}}
5. 命令
添加引用 using CommunityToolkit.Mvvm.Input;
5.1 RelayCommand
public IRelayCommand SendCommand { get; }SendCommand=new RelayCommand(Send);private void Send()
{}
5.2 AsyncRelayCommand
支持异步操作
public IAsyncRelayCommand LoadCommand { get; }LoadCommand = new AsyncRelayCommand(LoadAsync);private async Task<string> LoadAsync(){await Task.Delay(TimeSpan.FromSeconds(5));return "Load Success";}
ExecutionTask属性可监视操作进度,可获取方法执行返回值等
IsRunning属性:检查操作完成时间
ViewA.xaml
<Window.Resources><con:TaskResultConverter x:Key="TaskResultConverter"/><con:BoolToVisibleConverter x:Key="BoolToVisibleConverter"/></Window.Resources><StackPanel Grid.Row="1" Orientation="Vertical"><TextBlock Margin="5"><Run Text="Task status:"/><Run Text="{Binding LoadCommand.ExecutionTask.Status, Mode=OneWay}"/><LineBreak/><Run Text="Result:"/><Run Text="{Binding LoadCommand.ExecutionTask, Converter={StaticResource TaskResultConverter}, Mode=OneWay}"/></TextBlock><!-- IsIndeterminate="True" 一直处在滚动状态--><ProgressBar IsIndeterminate="True" Visibility="{Binding LoadCommand.IsRunning,Converter={StaticResource BoolToVisibleConverter}, Mode=OneWay}" Width="200" Height="20" HorizontalAlignment="Left" Margin="5" /><Button Content="AsyncCommand" Command="{Binding LoadCommand}" Width="200" Height="100" HorizontalAlignment="Left" Margin="5"/></StackPanel>
TaskResultConverter
public class TaskResultConverter : IValueConverter{public object? Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is Task<string> val && val.IsCompleted){return val.Result;}return null;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}
BoolToVisibleConverter
public class BoolToVisibleConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is bool val){return val ? Visibility.Visible : Visibility.Collapsed;}return Visibility.Collapsed;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}
效果:
6. Messenger
接口 IMessenger 是可用于在不同对象之间交换消息的类型协定。
MVVM Toolkit提供现装实现:WeakReferenceMessenger在内部使用弱引用,为收件人提供自动内存管理。StrongReferenceMessenger使用强引用,并且要求开发人员在不再需要接收者时手动取消订阅收件人
消息可以是数据类型或者自定义实体
public class InfoMessage {public string Title { get; set; }public string Message { get; set; }public int Id { get; set; }public DateTime Date { get; set; }}
添加引用 using CommunityToolkit.Mvvm.Messaging;
注册消息
WeakReferenceMessenger.Default.Register<InfoMessage>(this, (r, m) =>{//do somethingmessageService?.ShowMessage(this, $"收到消息:{m.Message} Date:{m.Date}");});
发送消息
WeakReferenceMessenger.Default.Send(new InfoMessage() {Date = DateTime.Now,Message="AAA"});
取消注册
WeakReferenceMessenger.Default.UnregisterAll(this);
7. Ioc
使用依赖项注入,它包括创建大量注入后端类的服务,这允许使用这些服务的代码不依赖于这些服务的实现详细信息,并且还可以轻松地交换这些服务的具体实现。
此模式还使平台特定的功能更易于后端代码使用,方法是通过服务进行抽象化,然后在需要时注入这些功能。
使用平台API:Ioc
添加引用 using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
public partial class App : Application{private Mutex mutex;protected override void OnStartup(StartupEventArgs e){//防止程序多开mutex = new Mutex(true,nameof(MVVMDemo),out bool ret);if(!ret){MessageBox.Show("软件已经在运行中,请检查!!");Environment.Exit(0);}InitialServices();new ViewA().Show();base.OnStartup(e);}private void InitialServices(){var services = new ServiceCollection();//单一实例服务 每一次获取的对象都是同一个services.AddSingleton<IMessageService, MessageBoxCustom>();//暂时性服务 请求获取-(GC回收-主动释放) 获取时创建 每一次获取的对象都不是同一个services.AddTransient<ViewAViewModel>();var provider = services.BuildServiceProvider();Ioc.Default.ConfigureServices(provider);}}
服务
public interface IMessageService{void ShowMessage(object owner, string message);}public class MessageBoxCustom : IMessageService{public void ShowMessage(object owner, string message){MessageBox.Show(message);}}
调用:
private IMessageService messageService;messageService=Ioc.Default.GetService<IMessageService>();messageService?.ShowMessage(this, $" ");
构造函数注入
private IMessageService messageService;//“构造函数注入”,这意味着 DI 服务提供商能够在创建所请求类型的实例时自动解析已注册服务之间的间接依赖关系。public ViewAViewModel(IMessageService _messageService){messageService = _messageService;}private void IOCTest(){//实际使用时并没有传入IMessageService 的实例,但可以使用,因为IOC框架自动注入messageService?.ShowMessage(this, "IOC测试");}
调用
public ViewA(){InitializeComponent();DataContext = Ioc.Default.GetService<ViewAViewModel>();}
8. 其他
8.1 global using
C#10新功能,新建文件GlobalUsing.cs
使用关键字 global 标识 using 指令,则 using 适用于整个项目
global using System;
global using System.Threading;
global using System.Threading.Tasks;
global using System.Windows.Data;
global using System.Globalization;
global using System.Windows;global using CommunityToolkit.Mvvm.ComponentModel;
global using CommunityToolkit.Mvvm.DependencyInjection;
global using CommunityToolkit.Mvvm.Input;
global using CommunityToolkit.Mvvm.Messaging;
global using Microsoft.Extensions.DependencyInjection;namespace MVVMDemo;public class GlobalUsing
{}
8.2 函数参数null检查
public void Show(string str){//null检查ArgumentNullException.ThrowIfNull(str);}
异常的时候,就会出现:
System.ArgumentNullException: 'Value cannot be null. (Parameter 'str')'
参考: Messenger - Windows Community Toolkit | Microsoft Docs
WPF -- MVVM框架 - CommunityToolkit.Mvvm相关推荐
- html 属于mvvm框架,前端MVVM框架avalon揭秘 - HTML编译器
MVVM试图更加清晰的讲用户界面(UI)开发从应用程序的业务逻辑与行为中心分离,由于,不少这样的模式的实现都须要利用声明式数据绑定来实现讲View(视图)工做从其余层分离css 因此出现了一大堆自定义 ...
- 疯狂 java轻量级框架_ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet
Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...
- .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器 在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 参考文章: (1)MVVM框架从WPF移植到UWP遇到的问题和解决方法 (2)https://www.cnblogs.com/durow/p/48 ...
- wpf mvvm框架_[Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
最近写了一些 MVVM 框架的文章,翻了一些 Microsoft Docs 的文档,顺便就对 MVVM 本身来了兴致,想看看更多当年相关的文档.在 MVVM 出现后十多年,我在不同的场合见到过多种 M ...
- c#事件的发布-订阅模型_NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器# 在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...
- WPF教程(十五)MVVM框架
作者本人以前是做C++的,当然很顺利的进入到WinForm,这也让我基本没有View-Model思维.学习WPF说白点也是因为其强大的UI,其实我忽视了很重要的一点,直到接触了MVVM框架,其实Web ...
- Reactive Extensions入门(5):ReactiveUI MVVM框架
从前面几篇文章可以了解到,Rx作为LINQ的一种扩展,极大地简化了异步编程.但Rx的用法不仅如此,由于其可高的扩展性,在其他很多方面也有所应用. 在前面例子中,我们使用代码和UI界面上的元素打交道,这 ...
- [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
这篇文章讨论: 模式与WPF MVP模式 为什么MVVM更加适用于WPF 用MVVM构建一个应用程序 译文地址: http://www.cnblogs.com/lujiao_cs/ar ...
最新文章
- Fetch API 初步解读
- deep learning with python 中文版-Deep Learning with Python
- 给电脑换源 npm 国内镜像 cnpm
- java在程序中加入音频_在任意Java程序中播放音频
- Print! Print! Print!
- java try finally connectoin close_Java SocketChannel類代碼示例
- Educational Codeforces Round 48
- mysql连接idea详细教程_idea配置连接数据库的超详细步骤
- 数据库服务器主机重启故障诊断分析
- ASP.NET Core——身份验证UI安装
- mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
- 12月25日服务器例行维护公告,12月25日维护公告 技能修改测试
- 一步步入门搭建SpringSecurity OAuth2(密码模式)
- LG GPRO2 SudaMod 3.1 自编译版 20180524 更新
- 怎么调大计算机浏览器内字体,电脑网页字体大小怎么调整(电脑里点击哪个是变换字体的)...
- UE4虚拟摄像头插件
- 声势浩大发展云服务的金蝶,如今“破茧”了吗
- 苹果微信昵称表情php,苹果手机微信名如何使用特殊符号
- 关于lib文件夹和报java.lang.NoClassDefFoundError解决办法
- “有意思”的英语单词(5)
热门文章
- ​南京大学图书馆《乡村振兴战略下传统村落文化旅游设计》新宝藏
- android控件向内弧度_描边/内间距/四个角不同弧度(包括圆角)
- 2007年肯定火的歌 等一分钟
- 程序员把地府后台管理系统做出来了,还有3.0版本!
- 跨境电商海关报关申报系统
- 2020某大佬字节一面的题目解答
- 【同步复制常见错误处理1】当IDENTITY_INSERT设置为OFF时不能向表插入显示值。(源:MSSQLServer,错误码:544)
- buildroot 树莓派3B+ WiFi
- 论智能出现的简约性和自恰性原理(上)
- 《NASA对N+3代先进飞行器概念设计最终报告》阅读笔记