WPF中MVVM工具包CommunityToolkit.Mvvm的使用方式

 更新时间:2025年05月14日 09:16:38   作者:月落.  
这篇文章主要介绍了WPF中MVVM工具包CommunityToolkit.Mvvm的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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等平台上使用。
  • 易于选取和使用:对应用程序结构或编码范例没有严格需求,可以灵活使用。
  • 按需取用:自由选择要使用的组件,所有类型都是松散耦合的。
  • 引用实现:为基类库中包含的接口提供实现,但缺少直接使用它们所需的具体类型。

用法

  • 安装:在Visual Studio中,通过NuGet包管理器搜索并安装CommunityToolkit.Mvvm包,
  • 引用:在项目中添加using CommunityToolkit.Mvvm;来使用新API。
  • 实现MVVM:通过继承ObservableObject来创建ViewModel,利用SetProperty方法实现属性变更通知,以及使用RelayCommandAsyncRelayCommand来实现命令模式。

功能

该库提供了一些基础类和接口的实现,主要包括:

  • ObservableObjectObservableRecipient:这些类实现了INotifyPropertyChanged接口,并提供了SetProperty方法,可以在属性值改变时触发PropertyChanged事件,简化数据绑定。
  • ICommand接口的实现,如RelayCommandAsyncRelayCommand:这些类可以帮助创建命令,命令是MVVM模式中的一个重要组成部分。
  • IMessenger和相关消息传递机制,如WeakReferenceMessengerStrongReferenceMessenger,用于组件间的松散耦合通信。

CommunityToolkit.Mvvm 包含的类型主要分为以下几个部分

CommunityToolkit.Mvvm.ComponentModel

  • ObservableObject:实现了 INotifyPropertyChanged 接口,用于创建响应属性变化的ViewModel。
  • ObservableRecipient:用于消息传递的基类。
  • ObservableValidator:用于数据验证的基类。

CommunityToolkit.Mvvm.DependencyInjection

  • Ioc:提供依赖注入的容器和相关服务。

CommunityToolkit.Mvvm.Input

  • RelayCommand:一个简单的命令实现,用于执行无参方法。
  • RelayCommand<T>:一个泛型版本的 RelayCommand,用于执行带参方法。
  • AsyncRelayCommand:一个异步命令实现,用于执行异步无参方法。
  • AsyncRelayCommand<T>:一个异步命令实现,用于执行异步带参方法。
  • IRelayCommandRelayCommand 的接口定义。
  • IRelayCommand<T>RelayCommand<T> 的接口定义。
  • IAsyncRelayCommandAsyncRelayCommand 的接口定义。
  • IAsyncRelayCommand<T>AsyncRelayCommand<T> 的接口定义。

CommunityToolkit.Mvvm.Messaging

  • IMessenger:消息传递接口,定义了消息发送和订阅的方法。
  • WeakReferenceMessenger:一个使用弱引用的消息传递类,用于避免内存泄漏。
  • StrongReferenceMessenger:一个使用强引用的消息传递类。
  • IRecipient<TMessage>:消息接收者接口,用于接收特定类型的消息。
  • MessageHandler<TRecipient, TMessage>:消息处理程序,用于处理特定类型的消息。

CommunityToolkit.Mvvm.Messaging.Messages

  • PropertyChangedMessage<T>:用于属性变化的消息。
  • RequestMessage<T>:用于请求特定类型响应的消息。
  • AsyncRequestMessage<T>:异步版本的 RequestMessage<T>
  • CollectionRequestMessage<T>:用于集合操作的请求消息。
  • AsyncCollectionRequestMessage<T>:异步版本的 CollectionRequestMessage<T>
  • ValueChangedMessage<T>:用于值变化的消息。

CommunityToolkit.Mvvm 还提供了一些关键属性和功能

ObservableObject

ObservableObjectCommunityToolkit.Mvvm 库中的一个基础类,它实现了 INotifyPropertyChanged 接口。这个接口是 .NET 数据绑定基础架构的一部分,当对象的一个属性改变时,它会通知绑定到该属性的任何元素。

  • 用法:ViewModel 通常会继承自 ObservableObject 类。
  • 示例代码
public class MyViewModel : ObservableObject
{
    private string _myProperty;
    public string MyProperty
    {
        get => _myProperty;
        set => SetProperty(ref _myProperty, value);
    }
}

[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);
}

[RelayCommand] 属性

[RelayCommand] 是一个特性,用于创建命令。命令是 MVVM 模式中的一个重要组成部分,用于将 View 的行为(如按钮点击)绑定到 ViewModel 中的方法。

  • 用法:在 ViewModel 中的方法上使用 [RelayCommand] 特性。
  • 示例代码
public partial class MyViewModel : ObservableObject
{
    [RelayCommand]
    private void ExecuteCommand()
    {
        // Command execution logic here
    }
}

这将生成一个 ICommand 实现,可以被 View 绑定。

其他属性

RelayCommandAsyncRelayCommand

这些类实现了 ICommand 接口,用于创建命令,是 MVVM 模式中命令模式的实现。

IMessenger

消息传递接口,用于在不同的 ViewModel 或 View 之间传递消息,实现组件间的松散耦合通信。

PropertyChangedMessage<T>

用于属性变化的消息,是 IMessenger 接口实现中用于传递属性变更通知的一种消息类型。

RequestMessage<T>AsyncRequestMessage<T>

用于请求特定类型响应的消息,其中 AsyncRequestMessage<T> 是异步版本的请求消息。

CollectionRequestMessage<T>AsyncCollectionRequestMessage<T>

用于集合操作的请求消息,其中 AsyncCollectionRequestMessage<T> 是异步版本的集合请求消息。

ValueChangedMessage<T>

用于值变化的消息,是 IMessenger 接口实现中用于传递值变更通知的一种消息类型。

CommunityToolkit.Mvvm 的框架类

CommunityToolkit.Mvvm.ComponentModel

  • ObservableObject:实现了 INotifyPropertyChangedINotifyPropertyChanging 接口,用于创建响应属性变化的 ViewModel。
  • ObservableRecipient:用于消息传递的基类。
  • ObservableValidator:用于数据验证的基类。

CommunityToolkit.Mvvm.DependencyInjection

  • Ioc:提供依赖注入的容器和相关服务。

CommunityToolkit.Mvvm.Input

  • RelayCommand:一个简单的命令实现,用于执行无参方法。
  • RelayCommand<T>:一个泛型版本的 RelayCommand,用于执行带参方法。
  • AsyncRelayCommand:一个异步命令实现,用于执行异步无参方法。
  • AsyncRelayCommand<T>:一个异步命令实现,用于执行异步带参方法。
  • IRelayCommandRelayCommand 的接口定义。
  • IRelayCommand<T>RelayCommand<T> 的接口定义。
  • IAsyncRelayCommandAsyncRelayCommand 的接口定义。
  • IAsyncRelayCommand<T>AsyncRelayCommand<T> 的接口定义。

CommunityToolkit.Mvvm.Messaging

  • IMessenger:消息传递接口,定义了消息发送和订阅的方法。
  • WeakReferenceMessenger:一个使用弱引用的消息传递类,用于避免内存泄漏。
  • StrongReferenceMessenger:一个使用强引用的消息传递类。
  • IRecipient<TMessage>:消息接收者接口,用于接收特定类型的消息。
  • MessageHandler<TRecipient, TMessage>:消息处理程序,用于处理特定类型的消息。

CommunityToolkit.Mvvm.Messaging.Messages

  • PropertyChangedMessage<T>:用于属性变化的消息。
  • RequestMessage<T>:用于请求特定类型响应的消息。
  • AsyncRequestMessage<T>:异步版本的 RequestMessage<T>
  • CollectionRequestMessage<T>:用于集合操作的请求消息。
  • AsyncCollectionRequestMessage<T>:异步版本的 CollectionRequestMessage<T>
  • ValueChangedMessage<T>:用于值变化的消息。

CommunityToolkit.Mvvm是一个现代、快速和模块化的MVVM库,它提供了尽可能大的灵活性,让开发人员可以自由选择要使用的组件,以最符合需求的方式组合这些生成块。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#画圆角矩形的方法

    C#画圆角矩形的方法

    这篇文章主要介绍了C#画圆角矩形的方法,涉及C#绘图的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • Unity UGUI通过摇杆控制角色移动

    Unity UGUI通过摇杆控制角色移动

    这篇文章主要为大家详细介绍了Unity3D基于陀螺仪实现VR相机功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • c# 实现RSA非对称加密算法

    c# 实现RSA非对称加密算法

    RSA解决了对称加密的一个不足,比如AES算法加密和解密时使用的是同一个秘钥,因此这个秘钥不能公开,因此对于需要公开秘钥的场合,我们需要在加密和解密过程中使用不同的秘钥,加密使用的公钥可以公开,解密使用的私钥要保密,这就是非对称加密的好处。 
    2021-06-06
  • c#中Invoke与BeginInvoke的用法及说明

    c#中Invoke与BeginInvoke的用法及说明

    这篇文章主要介绍了c#中Invoke与BeginInvoke的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C# 如何实现一个基于值相等性比较的字典

    C# 如何实现一个基于值相等性比较的字典

    这篇文章主要介绍了C# 如何实现一个基于值相等性比较的字典,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# 键值对数据排序代码

    C# 键值对数据排序代码

    这篇文章介绍了C# 键值对数据排序代码,有需要的朋友可以参考一下
    2013-11-11
  • c# 使用Json.NET实现json序列化

    c# 使用Json.NET实现json序列化

    这篇文章主要介绍了详解C#中的JSON序列化方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-05-05
  • C#基于jwt实现分布式登录

    C#基于jwt实现分布式登录

    这篇文章主要介绍了C#基于jwt实现分布式登录的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# 利用IRawPixels接口遍历栅格数据

    C# 利用IRawPixels接口遍历栅格数据

    本文主要介绍了利用IRawPixels接口遍历栅格数据。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C# Autofac的具体使用

    C# Autofac的具体使用

    Autofac是.NET领域最为流行的IoC框架之一,本文主要介绍了C# Autofac的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论