CommunityToolkit.Mvvm的使用-ObservableProperty 特性
ObservableProperty 特性
1.工作原理
[ObservableProperty] private string? name;
此name会自动生成如下的公开属性,我们在使用时,用Name这个公开的,对name不使用
public string? Name { get => name; set => SetProperty(ref name, value); }
2.通知依赖属性
一般用于当属性变化时,自动更新另一个一般属性
// 基本属性:FirstName [ObservableProperty] [NotifyPropertyChangedFor(nameof(FullName))] // 当FirstName变化时,通知FullName也变化 private string? _firstName; // 基本属性:LastName [ObservableProperty] [NotifyPropertyChangedFor(nameof(FullName))] // 当LastName变化时,通知FullName也变化 private string? _lastName; // 计算属性:依赖于FirstName和LastName public string FullName => $"{FirstName} {LastName}".Trim();
FullName这个变量依赖于FirstName和LastName
3.通知依赖命令
属性的变化,直接预示这命令是否符合执行的条件,也就是说,命令依赖于属性的变化。
// 用户名属性 - 当它变化时,通知LoginCommand更新可执行状态 [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(LoginCommand))]//说明这个命令依赖于此属性 private string? userName; // 密码属性 - 当它变化时,通知LoginCommand更新可执行状态 [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(LoginCommand))] private string? password; [ObservableProperty] private string? statusMessage; // 登录命令 [RelayCommand(CanExecute = nameof(CanLogin))]//这个命令是否可以执行,要看CanLogin的返回值
private void Login() { StatusMessage = $"登录成功!欢迎回来,{UserName}"; } // 决定登录命令是否可执行 private bool CanLogin() { // 只有当用户名和密码都不为空且长度符合要求时,才允许登录 return !string.IsNullOrWhiteSpace(UserName) && UserName.Length >= 3 && !string.IsNullOrWhiteSpace(Password) && Password.Length >= 6; }
这个例子主要说明登录命令是否可以执行,界面代码登录按钮绑定这个命令,则按钮的启用/禁用会自动关联,代码方面不用体现
<Button Content="登录" Command="{Binding LoginCommand}" Width="100" Height="35"/>
4.请求属性验证
ViewModel 需要继承ObservableValidator,他完全兼容ObservableObject
这个使用可以有效让我们使用的控件按照我们指定的规则来使用,比如密码的限制类型,或者不能为空和长度等等
[Required(ErrorMessage = "用户名不能为空")] // 使用[MinLength]验证:最小长度限制 [MinLength(3, ErrorMessage = "用户名至少需要3个字符")] [ObservableProperty] private string? userName; // 邮箱格式验证 [Required(ErrorMessage = "邮箱不能为空")] [EmailAddress(ErrorMessage = "请输入有效的邮箱地址")] [ObservableProperty] private string? email; // 密码验证 [Required(ErrorMessage = "密码不能为空")] [MinLength(6, ErrorMessage = "密码至少需要6个字符")] [ObservableProperty] private string? password; // 确认密码验证(自定义验证逻辑) [Required(ErrorMessage = "请确认密码")] [ObservableProperty] [CustomValidation(typeof(RegistrationViewModel), nameof(ValidatePasswordMatch))] private string? confirmPassword; // 自定义验证:确认密码与密码是否一致 public static ValidationResult? ValidatePasswordMatch(string? confirmPassword, ValidationContext context) { var viewModel = (RegistrationViewModel)context.ObjectInstance; if (viewModel.Password != confirmPassword) { return new ValidationResult("两次输入的密码不一致"); } return ValidationResult.Success; }
5.发送消息通知
ObservableRecipient 是 CommunityToolkit.Mvvm 中一个强大的基类,它继承自 ObservableObject 并实现了 IRecipient<PropertyChangedMessage<T>> 接口,专门用于接收属性变更消息。这使得 ViewModel 可以轻松接收和处理来自其他对象的属性变化通知。
浙公网安备 33010602011771号