Title

WPF CommunityToolkit.Mvvm学习三,ObservableProperty属性学习

简介:CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit.Mvvm)是一个现代、快速和模块化的 MVVM 库。

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

可以先参考

1、 WPF CommunityToolkit.Mvvm学习一,安装与初步使用 - 宇一心途 - 博客园

2、WPF CommunityToolkit.Mvvm学习二,前期工作搭建 - 宇一心途 - 博客园

 

本文将学习到以下的内容

ObservablePropertyNotifyPropertyChangedForNotifyCanExecuteChangedForNotifyDataErrorInfoNotifyPropertyChangedRecipientsICommandIRelayCommandObservableValidatorPropertyChangedMessage<T>IMessenger

1、先建立一个工程项目以供后面完整学习

1.1 创建WPF应用程序模板

  如下图①出输入WPF会出现对应的项目模板,我们选择WPF应用程序如下图②,然后点击下一步

属性字段上有 [ObservableProperty]标记,CommunityToolkit.Mvvm会自动给它生成一个对应的public属性,并在属性值改变时自动触发属性变更通知。

其中属性的命名规范为:lowerCamel_lowerCamel 或者 m_lowerCamel,最终会将之转换为 UpperCamel,建议在属性前面加上private,如以下例子

[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举例

最终结果如下:

 

 

 

image

 

通知依赖属性

使用 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}";   

 

运行结果

image

 

通知依赖命令

 使用 [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         } 

运行结果

image

 请求属性验证

 使用 [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}

 

image

 

 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         }

 

 

运行结果

image

 

 

运行结果

posted @ 2025-12-24 14:01  宇一心途  阅读(1)  评论(0)    收藏  举报