wpf CommunityToolkit.Mvvm8.1 MVVM工具包安裝參照指南

2023-04-09 06:01:25

CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名為 Microsoft.Toolkit.Mvvm)是一個現代、快速且模組化的 MVVM 庫。
它支援:.NET Standard 2.0、 .NET Standard 2.1 和 .NET 6(UI Framework 不支援)

 

檔案地址:
https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/
github:
https://github.com/CommunityToolkit/dotnet

 

1.安裝
nuget中安裝:CommunityToolkit.Mvvm

 

特別提示:不要再安裝下面這2箇舊版本的包了,官方都提示過期了,推薦用CommunityToolkit.Mvvm8.1

 

 

2.使用

CommunityToolkit.Mvvm8.1最令人驚喜的是它提供的源生成器功能,它極大簡化我們的mvvm程式碼

後面會整理一個系列文字逐一說明,下面簡單感受一下:

大部分通過標記一個屬性就可以實現某個功能,這個很方便快捷,推薦

常用的總結
1.繼承ObservableObject 並且類標記是分部類partial
2.私有變數標記屬性 [ObservableProperty]
3.NotifyCanExecuteChangedFor 通知依賴命令
NotifyPropertyChangedFor 通知依賴屬性
4.RelayCommand 定義命令
5.OnPropertyChanged 手動通知屬性更新
6.ButtonClickCommand.NotifyCanExecuteChanged() 手動通知命令更新
7.OnLastNameChanging OnLastNameChanged 某個屬性改變
8.OnPropertyChanged 所有屬性改變

定義viewmodel
1 public partial class DataViewModel2 : ObservableObject
2 {
3 
4 }

 

ObservableProperty標記屬性
1 /*
2 [ObservableProperty]標記後,會自動生成屬性(大寫命名),例如:下面會自動生成Title
3 
4 注意:這個私有變數命名:必須是小寫開頭,或者下劃線,或者m_
5 */
6 
7 [ObservableProperty]
8 private string title = "hello";

 

NotifyPropertyChangedFor通知依賴屬性
 1 public string Caption
 2 {
 3     get
 4     {
 5         return string.Format( "Title:{0}-{1}" , Title , LastName );
 6     }
 7 }
 8 
 9 
10 [ObservableProperty]
11 [NotifyPropertyChangedFor( nameof( Caption ) )]
12 private string lastName = "abc";

 

NotifyCanExecuteChangedFor通知依賴命令
1 /*
2         [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
3 NotifyCanExecuteChangedFor是通知依賴命令(觸發命令),相當於set中ButtonClickCommand.NotifyCanExecuteChanged();
4 */
5 
6 [ObservableProperty]
7 [NotifyCanExecuteChangedFor( nameof( ButtonClickCommand ) )]
8 private bool isEnabled = false;

 

命令
 1 /*
 2 RelayCommand是定義命令,自動生成的命令名是方法名+Command,並且初始化
 3 例如:下面的會自動生成ButtonClickCommand
 4 
 5 CanExecute是指定一個判斷方法,判斷是否可用
 6 */
 7 
 8 [RelayCommand( CanExecute = nameof( CanButton ) )]
 9 void ButtonClick ()
10 {
11     //點選按鈕,修改標題
12     Title = "hello(改)";
13 }
14 
15 bool CanButton ()
16 {
17     return IsEnabled;
18 }

 

非同步命令
 1 [RelayCommand]
 2 async Task AsyncButtonClick ()
 3 {
 4     await Task.Delay( 4800 );
 5     Title = "hello(Task改)";
 6 }
 7 
 8 
 9 
10 [RelayCommand]
11 async Task AsyncButtonParClick ( double val )
12 {
13     await Task.Delay( 4800 );
14     Title = $"hello(Task改):{val}";
15 }