使用MVVM Toolkit简化WPF开发

这篇具有很好参考价值的文章主要介绍了使用MVVM Toolkit简化WPF开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

在现代 WPF 应用程序开发中,遵循 MVVM(Model-View-ViewModel)模式已成为一种标准做法。MVVM 模式视图和逻辑分离,提高了代码的可测试性、可维护性。

MVVM Toolkit 核心功能

MVVM Toolkit 提供了一系列的功能,使得在 WPF 等程序中实现 MVVM 更加简单。

  1. ViewModel 基类:基类(例如 ObservableObject)为实现属性更改通知提供了基础结构,简化了 ViewModel 的创建过程。
  2. 命令的实现:MVVM Toolkit 提供了易于使用的命令实现(RelayCommand ),允许 View 以声明方式绑定到 ViewModel 上的方法。
  3. 弱消息机制:弱消息机制(WeakReferenceMessenger)允许不同对象之间收发消息,而不会造成内存泄漏。

安装

使用 nuget 安装到 WPF 项目中即可。由于 MVVM Toolkit 面向. NET Standard,所以可在任何应用平台上使用:UWP、WinForms、WPF、Xamarin、Uno 等。

Install-Package CommunityToolkit.Mvvm

代码生成

在 MVVM Toolkit 中,代码生成器扮演着重要的角色。通过利用代码生成器,它能够自动化诸如属性更改通知和命令实现等常见任务,减少样板代码,提高开发效率。

例如,开发者可以通过简单的属性标记,自动实现 INotifyPropertyChanged 接口:

partial class MyViewModel : ObservableObject
 {
     [ObservableProperty]
     private string name;

     [ObservableProperty]
     private bool isEnabled;
 }

以上代码会通过 Roslyn 的代码生成器功能生成如下代码:

 partial class MyViewModel
 {
     public string Name
     {
         get => name;
         set => SetProperty(ref name, value);
     }

     public bool IsEnabled
     {
         get => isEnabled;
         set => SetProperty(ref isEnabled, value);
     }
 }

在没有 MVVM Toolkit 的情况下,开发者需要手动实现 MVVM 的各个部分。例如,实现 INotifyPropertyChanged 接口通常涉及创建大量样板代码:

public class MyViewModel : INotifyPropertyChanged
{
    private string myProperty;

    public string MyProperty
    {
        get => myProperty;
        set
        {
            myProperty = value;
            OnPropertyChanged(nameof(MyProperty));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

相比之下,MVVM Toolkit 不仅减少了需要编写的代码量,也降低了出错的可能性,使得开发更加专注于业务逻辑本身。

使用 MVVM Toolkit 创建 ViewModel

依赖属性与命令

以下是使用 MVVM Toolkit 创建 ViewModel 的一个简单示例:

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    private string title = "Hello, MVVM Toolkit!";

    [RelayCommand]
    private void DealWithData()
    {
        // 数据处理逻辑
    }
}

ObservablePropertyRelayCommand 属性标记自动处理了属性更改通知和命令实现的细节,开发者只需关注业务逻辑,并在 XAML 中绑定对应的属性/命令,组件会自动生成对应的依赖属性。

注意,请一定使用 camelCase 命名法(可以带前导_),代码生成器会生成符合 PascalCase 标准的属性/方法名称。

弱引用消息

再看 WeakReferenceMessenger 在不同 ViewModel 或组件间发送和接收消息:

1. 定义消息类型

首先定义一个消息类型。消息可以是任何类或结构,通常包含发送者想要传递的数据:

public class MyMessage
{
    public string Text { get; }

    public MyMessage(string text)
    {
        Text = text;
    }
}

2. 发送消息

在一个 ViewModel 或组件中,你可以发送消息。假设有一个 SenderViewModel

public class SenderViewModel
{
    private void SendMessage()
    {
        var message = new MyMessage("Hello from SenderViewModel");
        WeakReferenceMessenger.Default.Send(message);
    }
}

SendMessage 方法创建了一个 MyMessage 实例,并通过 WeakReferenceMessenger.Default.Send 方法发送。

3. 接收消息

在另一个 ViewModel 或组件中,你可以注册以接收特定类型的消息。例如,你可能有一个 ReceiverViewModel

public class ReceiverViewModel
{
    public ReceiverViewModel()
    {
        // 注册以接收 MyMessage 类型的消息
        WeakReferenceMessenger.Default.Register<MyMessage>(this, (recipient, message) =>
        {
            // 处理接收到的消息
            string receivedText = message.Text;
            // Do something with receivedText
        });
    }
}

ReceiverViewModel 的构造函数中,使用 WeakReferenceMessenger.Default.Register 方法注册了消息接收器,当发送方发送 MyMessage 类型的消息时,这个接收器将被调用。

4. 解除消息注册

在不再需要接收消息时,或者在对象被销毁之前,应该解除消息的注册,以避免内存泄漏:

public class ReceiverViewModel
{
    public ReceiverViewModel()
    {
        WeakReferenceMessenger.Default.Register<MyMessage>(this, OnMessageReceived);
    }

    private void OnMessageReceived(object recipient, MyMessage message)
    {
        // 处理消息
    }

    ~ReceiverViewModel()
    {
        WeakReferenceMessenger.Default.Unregister<MyMessage>(this);
    }
}

ReceiverViewModel 通过其析构函数取消注册(也可以使用 IDispose 实现),确保当 ViewModel 被回收时,不会有消息处理器的引用残留。

总结

MVVM Toolkit 为 WPF 开发者提供了一个强大且易用的工具,它极大地简化了 MVVM 模式实现过程,虽然其他框架(MVVM Light/Prism 等)也提供了类似功能,但它非常轻量,使用简单,非常适合小型工程使用。

本文使用 AI 帮助润色了部分内容,文章经过人工校对。文章来源地址https://www.toymoban.com/news/detail-746592.html

到了这里,关于使用MVVM Toolkit简化WPF开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • WPF MvvM框架(MvvMLight,Microsoft Toolkit Mvvm,CommunityToolkit.Mvvm;鼠标,键盘,手写等事件绑定如:抬起按下事件)

    目录 1.MvvMLight(已废弃) 2. Microsoft Toolkit Mvvm(已废弃)  3.CommunityToolkit.Mvvm框架 4.Mvvm中的事件绑定 4.1 DataGrid表中按钮点击事件 4.2 绑定 鼠标事件,键盘事件,手写笔事件,多点触控事件 5.和PLC设备建立联系(联调)    本文中,继承接口,同步数据方法,command用法均一致; 1.继

    2024年02月04日
    浏览(61)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表TreeView的使用

    在我们展示一些参考信息的时候,有所会用树形列表来展示结构信息,如对于有父子关系的多层级部门机构,以及一些常用如字典大类节点,也都可以利用树形列表的方式进行展示,本篇随笔介绍基于WPF的方式,使用TreeView来洗实现结构信息的展示,以及对它的菜单进行的设

    2024年02月08日
    浏览(46)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Converter类实现内容的转义处理

    在我们WPF应用端的时候,和WInform开发或者Vue前端开发一样,有时候也需要对内容进行转义处理,如把一些0,1数值转换为具体含义的文本信息,或者把一些布尔变量转换为是否等,都是常见的转换处理,本篇随笔介绍在WPF应用端对内容使用Converter类实现内容的转义处理的操作。

    2024年02月08日
    浏览(48)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码

    在经过基于SqlSugar框架的WPF应用端系统界面及模块的不断优化和重构后,视图界面及视图模型等代码已趋稳定,因此完成前面的介绍后,现在开始统一基于代码生成工具Database2Sharp进行WPF应用端界面代码的快速生成了,代码除了和WPF应用端的基类保持一致处理外,并添加一些注

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

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

    2024年02月04日
    浏览(43)
  • 探秘Xceed WPF Toolkit:一个强大且灵活的UI开发利器

    项目地址:https://gitcode.com/xceedsoftware/wpftoolkit 如果你在寻找一款能够帮助你在Windows Presentation Foundation (WPF) 平台上快速构建美观、功能丰富的用户界面的工具包,那么Xceed WPF Toolkit绝对值得你关注。这款开源项目提供了大量预构建的控件和组件,旨在简化你的开发流程,提升应

    2024年03月27日
    浏览(42)
  • 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)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)

    在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端

    2024年02月09日
    浏览(55)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)

    在前面随笔《循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)》中介绍了Mvvm 的开发,以及一些界面效果,本篇随笔继续深入探讨基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发,介绍如何整合SqlSugar框架的基础接口,通过基类继承的方式,简化实际项目的开

    2024年02月09日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包