WPF CommunityToolkit.Mvvm学习三,ObservableProperty属性学习
简介:CommunityToolkit.Mvvm 包(又名 MVVM 工具包,以前称为 Microsoft.Toolkit.Mvvm)是一个现代、快速和模块化的 MVVM 库。
属性字段上有 [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更新 //}
发生更改时的事件提供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举例
最终结果如下:

通知依赖属性
使用 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}";
运行结果

通知依赖命令
使用 [ 实例
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 }
运行结果

请求属性验证
使用 [
| 特性 | 用途说明 | 示例 |
[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))] |
1 Text ="{Binding AccountName, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=true, ValidatesOnDataErrors=true}

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 }
运行结果


浙公网安备 33010602011771号