簡介:CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前稱為 Microsoft.Toolkit.Mvvm)是一個現代、快速和模塊化的 MVVM 庫。

官方文檔:ObservableProperty 特性 - Community Toolkits for .NET | Microsoft Learn

1、先建立一個工程項目以供後面完整學習

1.1 創建WPF應用程序模板

  如下圖①出輸入WPF會出現對應的項目模板,我們選擇WPF應用程序如下圖②,然後點擊下一步

屬性字段上有 [ObservableProperty]標記,CommunityToolkit.Mvvm會自動給它生成一個對應的public屬性,並在屬性值改變時自動觸發屬性變更通知。

其中屬性的命名規範為:lowerCamel_lowerCamel 或者 m_lowerCamel,最終會將之轉換為 UpperCamel,建議在屬性前面加上private,如以下例子

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_WPF

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_屬性值_02

[ObservableProperty]
private string? _accountName;
// 使用[ObservableProperty]自動生成以下屏蔽代碼(可觀察屬性):
//public string AccountName
//{
//    get => _accountName;
//    set => SetProperty(ref _accountName, value); // 值不同時候,自動通知UI更新
//}

View Code

 

發生更改時的事件提供4個函數接口

正在改變(參數 當前屬性值)

1、partial void OnNameChanging(string? value);

已經改變(參數 當前屬性值)
2、partial void OnNameChanged(string? value);

正在改變(參數 改變之前的屬性值,改變之後的屬性值)

3、partial void OnNameChanging(string? oldValue, string? newValue);

正在改變(參數 改變之前的屬性值,改變之後的屬性值)
4、partial void OnNameChanged(string? oldValue, string? newValue);

 用1與2舉例

最終結果如下:

 

 

 

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_WPF_03

 

通知依賴屬性

使用 NotifyPropertyChangedFor 實例

1  [ObservableProperty]
 2  [NotifyPropertyChangedFor(nameof(TestString))] // 當AccountName變化時,通知TestString也變化
 3  private string? _accountName;
 4  // 使用[ObservableProperty]自動生成以下屏蔽代碼(可觀察屬性):
 5  //public string AccountName
 6  //{
 7  //    get => _accountName;
 8  //    set => SetProperty(ref _accountName, value); // 值不同時候,自動通知UI更新
 9  //}
10  
11  public string TestString => $"test: {AccountName}";

 

運行結果

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_UI_04

 

通知依賴命令

NotifyCanExecuteChangedFor]

 

1         [ObservableProperty]
 2         public string testString = " ";
 3 
 4         [ObservableProperty]
 5         [NotifyCanExecuteChangedFor(nameof(SubmitCommand))]//説明這個命令依賴於此屬性
 6         private string? _accountName;
 7         // 使用[ObservableProperty]自動生成以下屏蔽代碼(可觀察屬性):
 8         //public string AccountName
 9         //{
10         //    get => _accountName;
11         //    set => SetProperty(ref _accountName, value); // 值不同時候,自動通知UI更新
12         //}
13 
14         // 提交命令
15         [RelayCommand(CanExecute = nameof(CanSubmit))]//這個命令是否可以執行,要看CanSubmitn的返回值
16         private void Submit() 
17         {
18             TestString = $"登錄成功!歡迎回來,{AccountName}";
19         }
20         // 決定提交命令是否可執行
21         private bool CanSubmit()
22         {
23             // 只有當用户名不為空且長度符合要求時,才允許登錄
24             return !string.IsNullOrWhiteSpace(AccountName) && AccountName.Length >= 3;
25         }

運行結果

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_屬性值_05

 請求屬性驗證

NotifyCanExecuteChangedFor] 實例

 

特性

用途説明

示例

[Required]

要求屬性值不能為空或默認值

[Required(ErrorMessage="必填")]

[StringLength]

限制字符串的最大和最小長度。

[StringLength(50, MinimumLength=2)]

[MinLength] / [MaxLength]

明確限制數組或字符串長度的最小/最大值。

[MinLength(2, ErrorMessage = "名字不能小於2")]

[Range]

將數值限制在指定範圍內。

[Range(18, 100)]

[EmailAddress]

驗證字符串是否符合電子郵件地址格式。

[EmailAddress]

[RegularExpression]

使用正則表達式驗證字符串格式。

[RegularExpression("^1[3-9]\\d{9}$", ErrorMessage = "電話格式不正確")]

[Compare]

比較兩個屬性的值是否相等(如密碼確認)。

[Compare(nameof(Password))]

 

 

想要在原有數據顯示校驗數據錯誤信息,必須開啓綁定中的驗證錯誤(Validation.Error事件)通知 NotifyOnValidationError="True"

1      Text ="{Binding AccountName, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=true, ValidatesOnDataErrors=true}

 

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_屬性值_06

 

1         [ObservableProperty]
 2         [Required(ErrorMessage = "名字不能為空")]
 3         [MinLength(2, ErrorMessage = "名字不能小於2")]
 4         private string? _accountName;
 5         // 使用[ObservableProperty]自動生成以下屏蔽代碼(可觀察屬性):
 6         //public string AccountName
 7         //{
 8         //    get => _accountName;
 9         //    set => SetProperty(ref _accountName, value); // 值不同時候,自動通知UI更新
10         //}
11 
12         // 提交命令
13         [RelayCommand(CanExecute = nameof(CanSubmit))]//這個命令是否可以執行,要看CanSubmitn的返回值
14         private void Submit() 
15         {
16             // 使用驗證屬性驗證所有屬性
17             ValidateAllProperties(); // Validates all properties with validation attributes
18         }
19         // 決定提交命令是否可執行
20         private bool CanSubmit()
21         {
22             return true;
23         }

 

 

運行結果

CommunityToolkit.Mvvm學習筆記(2)——ObservableObject_WPF_07

 

 

運行結果