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 可以轻松接收和处理来自其他对象的属性变化通知。

  1. 实际应用场景
    • 全局设置变更(如主题、语言、字体大小)
    • 用户状态变更(如登录、权限变更)
    • 跨模块通知(如订单状态更新触发库存模块响应)
posted @ 2025-08-16 13:46  灰色淡季  阅读(196)  评论(0)    收藏  举报