如何检测.NET MVVM中属性是否已通过验证?
如何直接检测属性是否已通过验证?
你不需要重复编写校验代码,改用ObservableValidator作为ViewModel基类即可——它内置了验证状态管理功能,能直接获取属性的验证结果。
步骤1:替换基类
将EthernetConnection的基类从ObservableObject改为ObservableValidator,后者集成了INotifyDataErrorInfo接口,会自动跟踪属性的验证状态。
步骤2:简化属性实现
利用ObservableValidator的SetProperty方法,它会自动触发属性变更通知和验证逻辑,无需手动调用OnPropertyChanged:
public partial class EthernetConnection : ObservableValidator { private string _IP = ""; [IPAddress] public string IP { get => _IP; set => SetProperty(ref _IP, value); } 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 ipStr && Regex.IsMatch(ipStr, pattern)) { return ValidationResult.Success; } return new ValidationResult("请输入合法的IP地址"); } } }
步骤3:在Apply按钮逻辑中检查验证状态
现在你可以直接通过以下方式判断IP属性是否合法:
- 检查单个属性:调用
GetErrors("IP"),若返回集合为空,说明该属性验证通过; - 检查所有属性:使用
HasErrors属性,它会返回当前ViewModel所有属性的整体验证状态。
示例Apply命令逻辑:
public void ApplyIPSetting() { // 检查IP属性是否验证通过 if (!GetErrors("IP").Any()) { // 执行设置IP的逻辑 SetDeviceIP(IP); } else { // 处理验证失败的情况,比如提示用户 } }
这样就完全不用重复编写正则校验逻辑,直接复用你已定义的IPAddressAttribute验证规则即可。
内容的提问来源于stack exchange,提问作者Volfogg
相关产品推荐
相关产品推荐

