WPF中MVVM工具包CommunityToolkit.Mvvm的使用方式
WPF中MVVM工具包CommunityToolkit.Mvvm
CommunityToolkit.Mvvm
,也稱為MVVM工具包,是Microsoft Community Toolkit的一部分。它是一個(gè)輕量級(jí)但功能強(qiáng)大的MVVM(Model-View-ViewModel)庫,旨在幫助開發(fā)者更容易地實(shí)現(xiàn)MVVM設(shè)計(jì)模式。
特點(diǎn)
- 獨(dú)立于平臺(tái)和運(yùn)行時(shí):支持.NET Standard 2.0、.NET Standard 2.1 和 .NET 6,與UI框架無關(guān),可在UWP、WinForms、WPF、Xamarin、Uno等平臺(tái)上使用。
- 易于選取和使用:對(duì)應(yīng)用程序結(jié)構(gòu)或編碼范例沒有嚴(yán)格需求,可以靈活使用。
- 按需取用:自由選擇要使用的組件,所有類型都是松散耦合的。
- 引用實(shí)現(xiàn):為基類庫中包含的接口提供實(shí)現(xiàn),但缺少直接使用它們所需的具體類型。
用法
- 安裝:在Visual Studio中,通過NuGet包管理器搜索并安裝
CommunityToolkit.Mvvm
包, - 引用:在項(xiàng)目中添加
using CommunityToolkit.Mvvm;
來使用新API。 - 實(shí)現(xiàn)MVVM:通過繼承
ObservableObject
來創(chuàng)建ViewModel,利用SetProperty
方法實(shí)現(xiàn)屬性變更通知,以及使用RelayCommand
或AsyncRelayCommand
來實(shí)現(xiàn)命令模式。
功能
該庫提供了一些基礎(chǔ)類和接口的實(shí)現(xiàn),主要包括:
- ObservableObject 和 ObservableRecipient:這些類實(shí)現(xiàn)了
INotifyPropertyChanged
接口,并提供了SetProperty
方法,可以在屬性值改變時(shí)觸發(fā)PropertyChanged
事件,簡化數(shù)據(jù)綁定。 - ICommand接口的實(shí)現(xiàn),如RelayCommand和AsyncRelayCommand:這些類可以幫助創(chuàng)建命令,命令是MVVM模式中的一個(gè)重要組成部分。
- IMessenger和相關(guān)消息傳遞機(jī)制,如WeakReferenceMessenger和StrongReferenceMessenger,用于組件間的松散耦合通信。
CommunityToolkit.Mvvm 包含的類型主要分為以下幾個(gè)部分
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:實(shí)現(xiàn)了INotifyPropertyChanged
接口,用于創(chuàng)建響應(yīng)屬性變化的ViewModel。ObservableRecipient
:用于消息傳遞的基類。ObservableValidator
:用于數(shù)據(jù)驗(yàn)證的基類。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依賴注入的容器和相關(guān)服務(wù)。
CommunityToolkit.Mvvm.Input
RelayCommand
:一個(gè)簡單的命令實(shí)現(xiàn),用于執(zhí)行無參方法。RelayCommand<T>
:一個(gè)泛型版本的RelayCommand
,用于執(zhí)行帶參方法。AsyncRelayCommand
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步無參方法。AsyncRelayCommand<T>
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步帶參方法。IRelayCommand
:RelayCommand
的接口定義。IRelayCommand<T>
:RelayCommand<T>
的接口定義。IAsyncRelayCommand
:AsyncRelayCommand
的接口定義。IAsyncRelayCommand<T>
:AsyncRelayCommand<T>
的接口定義。
CommunityToolkit.Mvvm.Messaging
IMessenger
:消息傳遞接口,定義了消息發(fā)送和訂閱的方法。WeakReferenceMessenger
:一個(gè)使用弱引用的消息傳遞類,用于避免內(nèi)存泄漏。StrongReferenceMessenger
:一個(gè)使用強(qiáng)引用的消息傳遞類。IRecipient<TMessage>
:消息接收者接口,用于接收特定類型的消息。MessageHandler<TRecipient, TMessage>
:消息處理程序,用于處理特定類型的消息。
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于屬性變化的消息。RequestMessage<T>
:用于請(qǐng)求特定類型響應(yīng)的消息。AsyncRequestMessage<T>
:異步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的請(qǐng)求消息。AsyncCollectionRequestMessage<T>
:異步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值變化的消息。
CommunityToolkit.Mvvm 還提供了一些關(guān)鍵屬性和功能
ObservableObject
ObservableObject
是 CommunityToolkit.Mvvm
庫中的一個(gè)基礎(chǔ)類,它實(shí)現(xiàn)了 INotifyPropertyChanged
接口。這個(gè)接口是 .NET 數(shù)據(jù)綁定基礎(chǔ)架構(gòu)的一部分,當(dāng)對(duì)象的一個(gè)屬性改變時(shí),它會(huì)通知綁定到該屬性的任何元素。
- 用法:ViewModel 通常會(huì)繼承自
ObservableObject
類。 - 示例代碼:
public class MyViewModel : ObservableObject { private string _myProperty; public string MyProperty { get => _myProperty; set => SetProperty(ref _myProperty, value); } }
[ObservableProperty] 屬性
[ObservableProperty]
是一個(gè)特性(Attribute),用于自動(dòng)生成可觀察屬性的 getter 和 setter,這些屬性會(huì)在值改變時(shí)觸發(fā) PropertyChanged
事件。
- 用法:直接在 ViewModel 的屬性上使用
[ObservableProperty]
特性。 - 示例代碼:
public partial class MyViewModel : ObservableObject { [ObservableProperty] private string? _name; }
這將生成一個(gè)類似下面的可觀察屬性:
public string? Name { get => _name; set => SetProperty(ref _name, value); }
[RelayCommand] 屬性
[RelayCommand]
是一個(gè)特性,用于創(chuàng)建命令。命令是 MVVM 模式中的一個(gè)重要組成部分,用于將 View 的行為(如按鈕點(diǎn)擊)綁定到 ViewModel 中的方法。
- 用法:在 ViewModel 中的方法上使用
[RelayCommand]
特性。 - 示例代碼:
public partial class MyViewModel : ObservableObject { [RelayCommand] private void ExecuteCommand() { // Command execution logic here } }
這將生成一個(gè) ICommand
實(shí)現(xiàn),可以被 View 綁定。
其他屬性
RelayCommand 和 AsyncRelayCommand:
這些類實(shí)現(xiàn)了 ICommand
接口,用于創(chuàng)建命令,是 MVVM 模式中命令模式的實(shí)現(xiàn)。
IMessenger:
消息傳遞接口,用于在不同的 ViewModel 或 View 之間傳遞消息,實(shí)現(xiàn)組件間的松散耦合通信。
PropertyChangedMessage<T>:
用于屬性變化的消息,是 IMessenger
接口實(shí)現(xiàn)中用于傳遞屬性變更通知的一種消息類型。
RequestMessage<T> 和 AsyncRequestMessage<T>:
用于請(qǐng)求特定類型響應(yīng)的消息,其中 AsyncRequestMessage<T>
是異步版本的請(qǐng)求消息。
CollectionRequestMessage<T> 和 AsyncCollectionRequestMessage<T>:
用于集合操作的請(qǐng)求消息,其中 AsyncCollectionRequestMessage<T>
是異步版本的集合請(qǐng)求消息。
ValueChangedMessage<T>:
用于值變化的消息,是 IMessenger
接口實(shí)現(xiàn)中用于傳遞值變更通知的一種消息類型。
CommunityToolkit.Mvvm 的框架類
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:實(shí)現(xiàn)了INotifyPropertyChanged
和INotifyPropertyChanging
接口,用于創(chuàng)建響應(yīng)屬性變化的 ViewModel。ObservableRecipient
:用于消息傳遞的基類。ObservableValidator
:用于數(shù)據(jù)驗(yàn)證的基類。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依賴注入的容器和相關(guān)服務(wù)。
CommunityToolkit.Mvvm.Input
RelayCommand
:一個(gè)簡單的命令實(shí)現(xiàn),用于執(zhí)行無參方法。RelayCommand<T>
:一個(gè)泛型版本的RelayCommand
,用于執(zhí)行帶參方法。AsyncRelayCommand
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步無參方法。AsyncRelayCommand<T>
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步帶參方法。IRelayCommand
:RelayCommand
的接口定義。IRelayCommand<T>
:RelayCommand<T>
的接口定義。IAsyncRelayCommand
:AsyncRelayCommand
的接口定義。IAsyncRelayCommand<T>
:AsyncRelayCommand<T>
的接口定義。
CommunityToolkit.Mvvm.Messaging
IMessenger
:消息傳遞接口,定義了消息發(fā)送和訂閱的方法。WeakReferenceMessenger
:一個(gè)使用弱引用的消息傳遞類,用于避免內(nèi)存泄漏。StrongReferenceMessenger
:一個(gè)使用強(qiáng)引用的消息傳遞類。IRecipient<TMessage>
:消息接收者接口,用于接收特定類型的消息。MessageHandler<TRecipient, TMessage>
:消息處理程序,用于處理特定類型的消息。
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于屬性變化的消息。RequestMessage<T>
:用于請(qǐng)求特定類型響應(yīng)的消息。AsyncRequestMessage<T>
:異步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的請(qǐng)求消息。AsyncCollectionRequestMessage<T>
:異步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值變化的消息。
CommunityToolkit.Mvvm
是一個(gè)現(xiàn)代、快速和模塊化的MVVM庫,它提供了盡可能大的靈活性,讓開發(fā)人員可以自由選擇要使用的組件,以最符合需求的方式組合這些生成塊。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c# 實(shí)現(xiàn)RSA非對(duì)稱加密算法
RSA解決了對(duì)稱加密的一個(gè)不足,比如AES算法加密和解密時(shí)使用的是同一個(gè)秘鑰,因此這個(gè)秘鑰不能公開,因此對(duì)于需要公開秘鑰的場合,我們需要在加密和解密過程中使用不同的秘鑰,加密使用的公鑰可以公開,解密使用的私鑰要保密,這就是非對(duì)稱加密的好處?!?/div> 2021-06-06C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典
這篇文章主要介紹了C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02c# 使用Json.NET實(shí)現(xiàn)json序列化
這篇文章主要介紹了詳解C#中的JSON序列化方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-05-05C# 利用IRawPixels接口遍歷柵格數(shù)據(jù)
本文主要介紹了利用IRawPixels接口遍歷柵格數(shù)據(jù)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02最新評(píng)論