WPF中MVVM工具包CommunityToolkit.Mvvm的使用方式
WPF中MVVM工具包CommunityToolkit.Mvvm
CommunityToolkit.Mvvm
,也稱為MVVM工具包,是Microsoft Community Toolkit的一部分。它是一個(gè)輕量級(jí)但功能強(qiáng)大的MVVM(Model-View-ViewModel)庫(kù),旨在幫助開(kāi)發(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框架無(wú)關(guān),可在UWP、WinForms、WPF、Xamarin、Uno等平臺(tái)上使用。
- 易于選取和使用:對(duì)應(yīng)用程序結(jié)構(gòu)或編碼范例沒(méi)有嚴(yán)格需求,可以靈活使用。
- 按需取用:自由選擇要使用的組件,所有類(lèi)型都是松散耦合的。
- 引用實(shí)現(xiàn):為基類(lèi)庫(kù)中包含的接口提供實(shí)現(xiàn),但缺少直接使用它們所需的具體類(lèi)型。
用法
- 安裝:在Visual Studio中,通過(guò)NuGet包管理器搜索并安裝
CommunityToolkit.Mvvm
包, - 引用:在項(xiàng)目中添加
using CommunityToolkit.Mvvm;
來(lái)使用新API。 - 實(shí)現(xiàn)MVVM:通過(guò)繼承
ObservableObject
來(lái)創(chuàng)建ViewModel,利用SetProperty
方法實(shí)現(xiàn)屬性變更通知,以及使用RelayCommand
或AsyncRelayCommand
來(lái)實(shí)現(xiàn)命令模式。
功能
該庫(kù)提供了一些基礎(chǔ)類(lèi)和接口的實(shí)現(xiàn),主要包括:
- ObservableObject 和 ObservableRecipient:這些類(lèi)實(shí)現(xiàn)了
INotifyPropertyChanged
接口,并提供了SetProperty
方法,可以在屬性值改變時(shí)觸發(fā)PropertyChanged
事件,簡(jiǎn)化數(shù)據(jù)綁定。 - ICommand接口的實(shí)現(xiàn),如RelayCommand和AsyncRelayCommand:這些類(lèi)可以幫助創(chuàng)建命令,命令是MVVM模式中的一個(gè)重要組成部分。
- IMessenger和相關(guān)消息傳遞機(jī)制,如WeakReferenceMessenger和StrongReferenceMessenger,用于組件間的松散耦合通信。
CommunityToolkit.Mvvm 包含的類(lèi)型主要分為以下幾個(gè)部分
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:實(shí)現(xiàn)了INotifyPropertyChanged
接口,用于創(chuàng)建響應(yīng)屬性變化的ViewModel。ObservableRecipient
:用于消息傳遞的基類(lèi)。ObservableValidator
:用于數(shù)據(jù)驗(yàn)證的基類(lèi)。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依賴注入的容器和相關(guān)服務(wù)。
CommunityToolkit.Mvvm.Input
RelayCommand
:一個(gè)簡(jiǎn)單的命令實(shí)現(xiàn),用于執(zhí)行無(wú)參方法。RelayCommand<T>
:一個(gè)泛型版本的RelayCommand
,用于執(zhí)行帶參方法。AsyncRelayCommand
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步無(wú)參方法。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è)使用弱引用的消息傳遞類(lèi),用于避免內(nèi)存泄漏。StrongReferenceMessenger
:一個(gè)使用強(qiáng)引用的消息傳遞類(lèi)。IRecipient<TMessage>
:消息接收者接口,用于接收特定類(lèi)型的消息。MessageHandler<TRecipient, TMessage>
:消息處理程序,用于處理特定類(lèi)型的消息。
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于屬性變化的消息。RequestMessage<T>
:用于請(qǐng)求特定類(lèi)型響應(yīng)的消息。AsyncRequestMessage<T>
:異步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的請(qǐng)求消息。AsyncCollectionRequestMessage<T>
:異步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值變化的消息。
CommunityToolkit.Mvvm 還提供了一些關(guān)鍵屬性和功能
ObservableObject
ObservableObject
是 CommunityToolkit.Mvvm
庫(kù)中的一個(gè)基礎(chǔ)類(lèi),它實(shí)現(xiàn)了 INotifyPropertyChanged
接口。這個(gè)接口是 .NET 數(shù)據(jù)綁定基礎(chǔ)架構(gòu)的一部分,當(dāng)對(duì)象的一個(gè)屬性改變時(shí),它會(huì)通知綁定到該屬性的任何元素。
- 用法:ViewModel 通常會(huì)繼承自
ObservableObject
類(lèi)。 - 示例代碼:
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è)類(lèi)似下面的可觀察屬性:
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:
這些類(lèi)實(shí)現(xiàn)了 ICommand
接口,用于創(chuàng)建命令,是 MVVM 模式中命令模式的實(shí)現(xiàn)。
IMessenger:
消息傳遞接口,用于在不同的 ViewModel 或 View 之間傳遞消息,實(shí)現(xiàn)組件間的松散耦合通信。
PropertyChangedMessage<T>:
用于屬性變化的消息,是 IMessenger
接口實(shí)現(xiàn)中用于傳遞屬性變更通知的一種消息類(lèi)型。
RequestMessage<T> 和 AsyncRequestMessage<T>:
用于請(qǐng)求特定類(lèi)型響應(yīng)的消息,其中 AsyncRequestMessage<T>
是異步版本的請(qǐng)求消息。
CollectionRequestMessage<T> 和 AsyncCollectionRequestMessage<T>:
用于集合操作的請(qǐng)求消息,其中 AsyncCollectionRequestMessage<T>
是異步版本的集合請(qǐng)求消息。
ValueChangedMessage<T>:
用于值變化的消息,是 IMessenger
接口實(shí)現(xiàn)中用于傳遞值變更通知的一種消息類(lèi)型。
CommunityToolkit.Mvvm 的框架類(lèi)
CommunityToolkit.Mvvm.ComponentModel
ObservableObject
:實(shí)現(xiàn)了INotifyPropertyChanged
和INotifyPropertyChanging
接口,用于創(chuàng)建響應(yīng)屬性變化的 ViewModel。ObservableRecipient
:用于消息傳遞的基類(lèi)。ObservableValidator
:用于數(shù)據(jù)驗(yàn)證的基類(lèi)。
CommunityToolkit.Mvvm.DependencyInjection
Ioc
:提供依賴注入的容器和相關(guān)服務(wù)。
CommunityToolkit.Mvvm.Input
RelayCommand
:一個(gè)簡(jiǎn)單的命令實(shí)現(xiàn),用于執(zhí)行無(wú)參方法。RelayCommand<T>
:一個(gè)泛型版本的RelayCommand
,用于執(zhí)行帶參方法。AsyncRelayCommand
:一個(gè)異步命令實(shí)現(xiàn),用于執(zhí)行異步無(wú)參方法。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è)使用弱引用的消息傳遞類(lèi),用于避免內(nèi)存泄漏。StrongReferenceMessenger
:一個(gè)使用強(qiáng)引用的消息傳遞類(lèi)。IRecipient<TMessage>
:消息接收者接口,用于接收特定類(lèi)型的消息。MessageHandler<TRecipient, TMessage>
:消息處理程序,用于處理特定類(lèi)型的消息。
CommunityToolkit.Mvvm.Messaging.Messages
PropertyChangedMessage<T>
:用于屬性變化的消息。RequestMessage<T>
:用于請(qǐng)求特定類(lèi)型響應(yīng)的消息。AsyncRequestMessage<T>
:異步版本的RequestMessage<T>
。CollectionRequestMessage<T>
:用于集合操作的請(qǐng)求消息。AsyncCollectionRequestMessage<T>
:異步版本的CollectionRequestMessage<T>
。ValueChangedMessage<T>
:用于值變化的消息。
CommunityToolkit.Mvvm
是一個(gè)現(xiàn)代、快速和模塊化的MVVM庫(kù),它提供了盡可能大的靈活性,讓開(kāi)發(fā)人員可以自由選擇要使用的組件,以最符合需求的方式組合這些生成塊。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unity UGUI通過(guò)搖桿控制角色移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Unity3D基于陀螺儀實(shí)現(xiàn)VR相機(jī)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11c# 實(shí)現(xiàn)RSA非對(duì)稱加密算法
RSA解決了對(duì)稱加密的一個(gè)不足,比如AES算法加密和解密時(shí)使用的是同一個(gè)秘鑰,因此這個(gè)秘鑰不能公開(kāi),因此對(duì)于需要公開(kāi)秘鑰的場(chǎng)合,我們需要在加密和解密過(guò)程中使用不同的秘鑰,加密使用的公鑰可以公開(kāi),解密使用的私鑰要保密,這就是非對(duì)稱加密的好處?!?/div> 2021-06-06c#中Invoke與BeginInvoke的用法及說(shuō)明
這篇文章主要介紹了c#中Invoke與BeginInvoke的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01C# 如何實(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à)值,下面跟著小編一起來(lái)看下吧2017-02-02最新評(píng)論