如何通过ObservableValidator判断CommunityToolkit.Mvvm中特定属性是否有错误
问题描述
我当前正在使用CommunityToolkit.Mvvm,通过ValidationAttribute对部分属性进行验证,示例代码如下:
string _RemoteIP = ""; [IPAddress] public string RemoteIP { get => _RemoteIP; set { if (_RemoteIP != value) { _RemoteIP = value; OnPropertyChanged(); ValidateProperty(RemoteIP); } } } public sealed class IPAddressAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string _pattern = @"^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$"; if (value is string _string && Regex.IsMatch(_string, _pattern)) { return ValidationResult.Success; } return new("InvalidIPAddress"); } }
当用户点击提交按钮时,我需要判断特定属性是否存在错误(而非所有属性),请问该如何实现?
实现方案
核心思路
借助CommunityToolkit.Mvvm中ObservableValidator基类提供的GetErrors方法,直接获取指定属性的验证错误集合,以此判断该属性是否存在验证问题。
具体步骤
- 确保你的ViewModel继承自
ObservableValidator(你当前代码中能调用ValidateProperty,说明已经继承了这个基类)。 - 在提交按钮绑定的命令方法中,执行以下操作:
- 可选:手动触发一次目标属性的验证(避免用户未修改过属性时,验证逻辑未执行);
- 调用
GetErrors方法传入目标属性名,获取错误集合; - 判断集合是否为空,决定是否继续提交流程。
代码示例
// 假设ViewModel继承自ObservableValidator public ICommand SubmitCommand => new RelayCommand(HandleSubmit); private void HandleSubmit() { // 手动触发RemoteIP属性的验证(可选,根据业务场景决定) ValidateProperty(RemoteIP, nameof(RemoteIP)); // 获取RemoteIP属性的所有验证错误 var ipValidationErrors = GetErrors(nameof(RemoteIP)); // 判断是否存在错误 if (ipValidationErrors.Any()) { // 存在错误,执行错误处理逻辑,比如提示用户 var errorMessage = ipValidationErrors.Cast<ValidationResult>().First().ErrorMessage; // 示例:MessageBox.Show(errorMessage); return; } // 没有错误,执行提交逻辑 // ... }
补充说明
GetErrors(string propertyName)返回的是该属性对应的所有ValidationResult集合,通过Any()方法可快速判断是否存在错误;- 如果需要同时检查多个特定属性,只需分别调用
GetErrors传入对应的属性名即可; - 若属性在之前已经被修改过(比如用户输入过内容),
ValidateProperty已经执行过,此时可以跳过手动触发验证的步骤。
内容的提问来源于stack exchange,提问作者Volfogg
相关产品推荐
相关产品推荐

