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
相关产品推荐
相关产品推荐

