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

WPF使用IDataErrorInfo验证Model子类属性不生效问题咨询

问题根因

你绑定的Projecte.IdPacient是嵌套属性,WPF的IDataErrorInfo验证机制会去找属性所属的实例上的IDataErrorInfo实现:

  • CodiClient是ViewModel本身的属性,所以会触发ViewModel里的索引器,验证正常
  • IdPacient属于Projecte实例(类型是IProjecteModel),而ProjecteModel没有实现IDataErrorInfo,所以验证逻辑不会被触发,自然走不到ViewModel的索引器里。

可行解决方案

方案1:Model层实现IDataErrorInfo(推荐,符合业务规则下沉原则)

把属于Model本身的业务验证规则放到Model层实现,无需修改现有ViewModel和View的绑定逻辑,验证规则复用性更高:

public class ProjecteModel : ObservableObject, IProjecteModel, IDataErrorInfo
{
    private string _idPacient;
    public string IdPacient
    {
        get => _idPacient;
        set
        {
            _idPacient = value;
            OnPropertyChanged(nameof(IdPacient));
        }
    }

    public string Error => null;

    public string this[string columnName]
    {
        get
        {
            string msg = string.Empty;
            switch (columnName)
            {
                case nameof(IdPacient):
                    if (string.IsNullOrWhiteSpace(IdPacient))
                    {
                        msg = "Id Pacient is required.";
                    }
                    break;
            }
            return msg;
        }
    }
}

方案2:ViewModel层包装嵌套属性(适合验证逻辑和当前ViewModel场景强绑定的情况)

在ViewModel中新增一层IdPacient属性代理Projecte的对应属性,修改ViewModel代码:

public class ProjecteViewModel : BaseViewModel, IDataErrorInfo
{
    // 原有代码保持不变
    public string IdPacient
    {
        get => Projecte.IdPacient;
        set
        {
            Projecte.IdPacient = value;
            OnPropertyChanged(nameof(IdPacient));
        }
    }

    // 索引器里保留你原来的case "IdPacient"逻辑即可
}

同步修改View层绑定,直接绑定ViewModel的IdPacient:

<TextBox x:Name="IdPacient"
         Width="150" 
         HorizontalAlignment="Left"
         Margin="0, 0, 0, 15"
         Foreground="{StaticResource ForegroundFieldValuesBrush}"
         Text="{Binding IdPacient, 
                        Mode=TwoWay, 
                        UpdateSourceTrigger=PropertyChanged, 
                        ValidatesOnDataErrors=True}"/>

方案3:升级使用INotifyDataErrorInfo(兼容.NET 4.5+项目可选)

如果你的项目运行环境支持.NET Framework 4.5及以上版本,可以替换IDataErrorInfo为更新的INotifyDataErrorInfo接口,该接口支持异步验证、多错误信息、嵌套属性灵活验证等特性,不需要强制Model层实现验证接口。

内容的提问来源于stack exchange,提问作者McNets

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:15:03