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
方法实现属性变更通知,以及使用RelayCommand
或AsyncRelayCommand
来实现命令模式。
功能
该库提供了一些基础类和接口的实现,主要包括:
- ObservableObject 和 ObservableRecipient :这些类实现了
INotifyPropertyChanged
接口,并提供了SetProperty
方法,可以在属性值改变时触发PropertyChanged
事件,简化数据绑定。 - ICommand 接口的实现,如RelayCommand 和AsyncRelayCommand:这些类可以帮助创建命令,命令是MVVM模式中的一个重要组成部分。
- IMessenger 和相关消息传递机制,如WeakReferenceMessenger 和StrongReferenceMessenger,用于组件间的松散耦合通信。
CommunityToolkit.Mvvm
包含的类型主要分为以下几个部分:
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:实现了INotifyPropertyChanged
接口,用于创建响应属性变化的ViewModel。ObservableRecipient
:用于消息传递的基类。ObservableValidator
:用于数据验证的基类。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依赖注入的容器和相关服务。
CommunityToolkit.Mvvm.Input
RelayCommand
:一个简单的命令实现,用于执行无参方法。RelayCommand<T>
:一个泛型版本的RelayCommand
,用于执行带参方法。AsyncRelayCommand
:一个异步命令实现,用于执行异步无参方法。AsyncRelayCommand<T>
:一个异步命令实现,用于执行异步带参方法。IRelayCommand
:RelayCommand
的接口定义。IRelayCommand<T>
:RelayCommand<T>
的接口定义。IAsyncRelayCommand
:AsyncRelayCommand
的接口定义。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
-
ObservableObject
是CommunityToolkit.Mvvm
库中的一个基础类,它实现了INotifyPropertyChanged
接口。这个接口是 .NET 数据绑定基础架构的一部分,当对象的一个属性改变时,它会通知绑定到该属性的任何元素。 -
用法 :ViewModel 通常会继承自
ObservableObject
类。 -
示例代码 :
cspublic class MyViewModel : ObservableObject { private string _myProperty; public string MyProperty { get => _myProperty; set => SetProperty(ref _myProperty, value); } }
[ObservableProperty] 属性
-
[ObservableProperty]
是一个特性(Attribute),用于自动生成可观察属性的 getter 和 setter,这些属性会在值改变时触发PropertyChanged
事件。 -
用法 :直接在 ViewModel 的属性上使用
[ObservableProperty]
特性。 -
示例代码 :
cspublic partial class MyViewModel : ObservableObject { [ObservableProperty] private string? _name; }
这将生成一个类似下面的可观察属性:
cspublic string? Name { get => _name; set => SetProperty(ref _name, value); }
[RelayCommand] 属性
-
[RelayCommand]
是一个特性,用于创建命令。命令是 MVVM 模式中的一个重要组成部分,用于将 View 的行为(如按钮点击)绑定到 ViewModel 中的方法。 -
用法 :在 ViewModel 中的方法上使用
[RelayCommand]
特性。 -
示例代码 :
cspublic partial class MyViewModel : ObservableObject { [RelayCommand] private void ExecuteCommand() { // Command execution logic here } }
这将生成一个
ICommand
实现,可以被 View 绑定。
其他属性
-
RelayCommand 和 AsyncRelayCommand:
- 这些类实现了
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
:实现了INotifyPropertyChanged
和INotifyPropertyChanging
接口,用于创建响应属性变化的 ViewModel。ObservableRecipient
:用于消息传递的基类。ObservableValidator
:用于数据验证的基类。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依赖注入的容器和相关服务。
CommunityToolkit.Mvvm.Input
RelayCommand
:一个简单的命令实现,用于执行无参方法。RelayCommand<T>
:一个泛型版本的RelayCommand
,用于执行带参方法。AsyncRelayCommand
:一个异步命令实现,用于执行异步无参方法。AsyncRelayCommand<T>
:一个异步命令实现,用于执行异步带参方法。IRelayCommand
:RelayCommand
的接口定义。IRelayCommand<T>
:RelayCommand<T>
的接口定义。IAsyncRelayCommand
:AsyncRelayCommand
的接口定义。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库,它提供了尽可能大的灵活性,让开发人员可以自由选择要使用的组件,以最符合需求的方式组合这些生成块。