Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm

这篇具有很好参考价值的文章主要介绍了Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在Wpf下最常使用的就是Mvvm模式了,有自己造轮子构建Mvvm框架的,也有使用现成的开源项目,我之前一直使用的是轻量级的MvvmLight了,这个框架还是非常不错的,使用也简单,不占用太大空间,其中最喜欢的莫过于全局Messenger了,可谓是神器。最近有个项目使用.Net6开发,在NuGet发现MvvmLight已经很久不更新了,上一次还是2018年9月12日,偶然发现微软官方出的Microsoft.Toolkit.Mvvm 完全继承了Messenger的优良传统,这是一个官方社区套件(Windows Community Toolkit),延续了MVVMLight的风格,是一个轻量级的组件,而且它基于.NET Standard 2.0,可用于UWP, WinForms, WPF, Xamarin, Uno等多个平台。

相比它的前身 MVVMLight,它有以下特点:
更高:版本号更高,一出手就是7.0。
更快:速度更快,MVVM Toolkit从一开始就以高性能为实现目标。
更强:后台更强,MVVM Toolkit的全程是’Microsoft.Toolkit.Mvvm’,根正苗红。

官方文档地址:
链接: https://docs.microsoft.com/zh-cn/windows/communitytoolkit/mvvm/introduction

环境

运行环境:.Net 6
开发环境:VS2022 17.0.4
框架语言:WPF

注意

CommunityToolkit.Mvvm 和 Microsoft.Toolkit.Mvvm 有啥区别[doge脸]
哈哈,从Nuget包管理中可以看到,两个套件除了名字不同,其他几乎一模一样,微软改名部实锤了,
Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm

使用

如果用过MvvmLight的话,上手应该是非常简单的

1、ObservableObject的使用

在MvvmLight框架下,只要在ViewModel继承ViewModelBase即可,在Microsoft.Toolkit.Mvvm中正常继承ObservableObject即可,同时还有ObservableRecipient、ObservableValidator等可被选择,其实在MvvmLight框架下,ViewModelBase也是继承了ObservableObject,相当于官方的这个框架更加的灵活,在不同的场景下继承不同的类,以实现不同的效果,这也跟.Net Core很像,一切都更加原子化,模块化。
ObservableObject:实现了最基本的属性更新:SetProperty 等
ObservableRecipient:继承自ObservableObject,增加了Messenger的相关功能
ObservableValidator:这个就更不用说了,看名字就知道是用于验证属性的

public class MainWindowViewModel : ObservableObject
{
        public MainWindowViewModel()
        {
            Status = "Hello";
        }
        private string _status;

        public string Status
        {
            get => _status;
            set => SetProperty(ref _status, value);
        }
}

前端绑定属性就行了

 <TextBlock Margin="10" Text="{Binding Status}" />
2、IRelayCommand和IAsyncRelayCommand

要实现按钮的点击事件进行绑定,都需要使用继承自ICommand的接口,IRelayCommand和IAsyncRelayCommand也是如此,同时增加了NotifyCanExecuteChanged来通知ICommand.CanExecute属性发生了改变。
这里以IAsyncRelayCommand为例来实现一个进度条的功能,

public class MainWindowViewModel : ObservableObject
{
        public MainWindowViewModel()
        {
            Status = "Hello";
            ExecCommand = new AsyncRelayCommand(ExecAsync);
        }
        private string _status;

        public string Status
        {
            get => _status;
            set => SetProperty(ref _status, value);
        }
        private int _progressValue;

        public int ProgressValue
        {
            get => _progressValue;
            set => SetProperty(ref _progressValue, value);
        }
        public ICommand ExecCommand { get; }
        private async Task ExecAsync()
        {
            Status = "Processing...";

            await Task.Run(async () =>
            {
                for (int i = 0; i <= 100; i++)
                {
                    ProgressValue = i;

                    await Task.Delay(100);
                }
            });
            Status = "Complete";
        }
}

前端如下

            <StackPanel x:Name="sp1">
                <Button Margin="10" Command="{Binding ExecCommand}" Content="Button" />
                <TextBlock Margin="10" Text="{Binding Status}" />
                <ProgressBar Margin="10" Value="{Binding ProgressValue}" Minimum="0" Maximum="100" />
            </StackPanel>
3、Messenger的使用

在MvvmLight框架下,只要注册一下

Messenger.Default.Register<string>(this, "ReceiveMessage", ReceiveMessage);

在任意地方只要

Messenger.Default.Send<string>("Hello", "ReceiveMessage");

就能在注册的类中收到该消息,并进行相应的处理。
在MVVM Toolkit也很好的继承了这一功能,而且使用更方便,提供了WeakReferenceMessenger和StrongReferenceMessenger,两个都继承自IMessenger,从名字就可看出各自的不同用途,说实话,到目前为止我也没用过StrongReferenceMessenger,项目中一直使用的是WeakReferenceMessenger,想了解的具体可查看官方文档
实际实用中,WeakReferenceMessenger可以在任意地方使用

WeakReferenceMessenger.Default.Register<string>(this, OnReceive);

private void OnReceive(object recipient, string message)
 {
     ReceiveMessage = message;
 }

这样只需要在任意地方send即可

WeakReferenceMessenger.Default.Send("Hello");

在上方讲ObservableObject中提到ObservableRecipient是实现了Messenger,那实际使用中可以这样,继承ObservableRecipient,并实现IRecipient

public class MainWindowViewModel : ObservableRecipient,IRecipient<MessageModel>
{
        public MainWindowViewModel()
        {
            Status = "Hello";
            ExecCommand = new AsyncRelayCommand(ExecAsync);
        }
        private string _status;

        public string Status
        {
            get => _status;
            set => SetProperty(ref _status, value);
        }
        private int _progressValue;

        public int ProgressValue
        {
            get => _progressValue;
            set => SetProperty(ref _progressValue, value);
        }
        private string _receiveMessage;
        public string ReceiveMessage
        {
            get => _receiveMessage;
            set => SetProperty(ref _receiveMessage, value);
        }
        public ICommand ExecCommand { get; }
        private async Task ExecAsync()
        {
            Status = "Processing...";

            await Task.Run(async () =>
            {
                for (int i = 0; i <= 100; i++)
                {
                    ProgressValue = i;

                    await Task.Delay(100);
                }
            });
            Status = "Complete";
            WeakReferenceMessenger.Default.Send(new MessageModel { Num= 123, Str=DateTime.Now.ToString()});
        }
        public void Receive(MessageModel message)
        {
            ReceiveMessage = $"Num={message.Num},Str={message.Str}";
        }
}

IRecipient要求实现Receive方法,继承这个接口就相当于Register了,这里需要注意的是,在ObservableRecipient中有一个属性来指示当前类是否被注册了

this.IsActive = true;

只有设置为true,才能收到消息。
这个可以理解为是解除注册的设置,如果是正常使用Messenger,一般需要在关闭页面将注册的消息注销,可以这么做

this.Unloaded += (sender, e) => WeakReferenceMessenger.Default.UnregisterAll(this);

将当前界面的所有消息进行注销。

4、IOC的使用

在.Net Core之后,Asp.Net Web上经常会使用IOC(控制反转)将一些接口或者配置文件进行依赖注入,在WPF中可能很少使用这一功能,在MVVM Toolkit框架中也实现了这个功能

    public interface IFoo
    {
        string GetText();
    }
    public class Foo : IFoo
    {
        public string GetText()
        {
            return "Hello";
        }
    }
    //这里使用了ServiceCollection,需要另外引入Microsoft.Extensions.DependencyInjection
    public partial class App : Application
    {
        public App()
        {
            Ioc.Default.ConfigureServices(new ServiceCollection().AddSingleton<IFoo,Foo>().BuildServiceProvider());
        }
    }  

这样可以在任意地方使用

    public class MainWindow4ViewModel: ObservableObject
    {
        public MainWindow4ViewModel()
        {
            Text1 =Ioc.Default.GetService<IFoo>().GetText();
        }
        private string _text1;
        public string Text1
        {
            get => _text1;
            set => SetProperty(ref _text1, value);
        }
     }
总结

官方的这个套件功能还是非常强大的,而且很轻量,更新速度也较快,截止到2021年12月,最近版本的发布日期为2021年11月19日,还是非常不错的,从官方公布的使用对比速度来看,还是很快的。
Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm文章来源地址https://www.toymoban.com/news/detail-459248.html

到了这里,关于Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用MVVM Toolkit简化WPF开发

    最近. NET 8 的 WPF 推出了 WPF File Dialog改进,这样无需再引用 Win32 命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了。顺手写了一个小的 WPF 程序,在使用 Model-View-ViewModel(MVVM) 模式的时候,我不想使用 Prism 等重量级的框架,找了一个轻量级的 MVVM Community T

    2024年02月05日
    浏览(62)
  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。 并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多

    2024年02月06日
    浏览(63)
  • 探索MVVM Toolkit:简化.NET应用开发,构建高效MVVM架构

      概述: MVVM Toolkit是.NET平台的强大工具包,旨在简化MVVM应用程序开发。提供基础功能如ViewModelBase和RelayCommand,支持数据绑定和命令绑定,通过Messenger实现消息订阅发布。其高级功能包括ObservableObject和WeakEventListener,助力开发人员构建可维护、高性能的MVVM应用,提升用户体

    2024年02月20日
    浏览(47)
  • WPF .Net6框架下, 使用 Microsoft.Xaml.Behaviors.Wpf 的Interaction.Triggers特性,实现ComboBox 在展开时,触发刷新列表内容的动作

    ComboBox 在WPF中是常见的控件。 一般情况下,在绑定好数据源后,其内容是固定的。 当然,你也可以实时刷新,但这将带来较高的资源消耗。 因此有个折中的办法: 只在它在展开时,自动更新列表内容。 当前文章基于 .Net6框架,其他框架不适用。 这个是用于平替winform某个组

    2024年02月09日
    浏览(59)
  • [.NET/WPF] CommunityToolkit.Mvvm 异步指令

    我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作 工作进行时, 按钮不可再次被点击 工作进行时, 会显示进度条, 或者 “加载中” 的动画 CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方法, 当我们为这样的异

    2024年02月12日
    浏览(45)
  • wpf自定义Mvvm框架

    1.DelegateCommand.cs NotificationObject.cs

    2024年02月16日
    浏览(33)
  • VisualStudio[WPF/.NET]基于CommunityToolkit.Mvvm架构开发

    项目模板选择如下: 暂时随机填一个目标框架,待会改: 双击“解决方案资源管理器”中项目CU-APP, 打开项目工程文件CU-APP.csproj, 修改目标框架 TargetFramework 为.net framework 4.7.2 ;  C#语言版本 LangVersion 为  9.0  \\\"工具\\\" - \\\"NuGet包管理器\\\",“管理解决方案的NuGet程序包(N)”,  或者,

    2024年02月07日
    浏览(40)
  • WPF 使用MVVM框架创建一个项目

    步骤如下: 1、打开Visual Studio 2017(或其他版本),选择新建项目 2、选择WPF应用(.Net Framework),同时给项目命名,并选择项目存放路径,最后点击确定 3、右键点击解决方案名称,点击“管理NuGet程序包”,点击浏览,在输入框中输入mvvmlight,点击MvvmLight进行安装,安装过程

    2024年02月05日
    浏览(66)
  • 工业上位机开发实战 WPF + MVVM 框架

    上一篇博客介绍了上位机实现MVVM 框架的步骤 MVVMtoolkit 学习_叮当说的博客-CSDN博客 下面我们继续来讲解下实现上位机中会遇到的一些小问题: 回顾: 之前的程序中我们已经知道了 ,当数据改变的时候,可以使用通知的方法来来告知其他的模块这样便可以实现多个界面的通

    2024年02月04日
    浏览(43)
  • 【WPF系列】【MVVM】Prism开源框架学习(一)

    第一章 【WPF系列】【MVVM】Prism开源框架学习(一) 这里先简单介绍下Prism是什么,怎么去学习,资料怎么获取。 Prism是一个用于构建WPF、UWP和Xamarin应用程序的开源框架,它提供了一套MVVM(Model-View-ViewModel)的架构模式,以及一组工具和库,帮助开发人员更容易地创建可扩展

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包