You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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方法,直接获取指定属性的验证错误集合,以此判断该属性是否存在验证问题。

具体步骤

  1. 确保你的ViewModel继承自ObservableValidator(你当前代码中能调用ValidateProperty,说明已经继承了这个基类)。
  2. 在提交按钮绑定的命令方法中,执行以下操作:
    • 可选:手动触发一次目标属性的验证(避免用户未修改过属性时,验证逻辑未执行);
    • 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:12:16