FluentValidation在C# WPF中的应用
内容提要
FluentValidation是一个基于.NET开发的验证框架,支持链式操作,易于理解,功能完善。本文介绍了如何在WPF中使用FluentValidation进行输入验证,包括验证基本数据类型属性和复杂属性。文章提供了代码示例和效果图。
延伸解读
复杂属性验证的关键:实现IDataErrorInfo
文章指出,FluentValidation官网的Complex Properties示例在WPF中直接使用可能无效。作者通过实践发现,要让ViewModel中的对象属性(如Student)和集合属性(如Fields)的子属性验证生效,必须让ViewModel和子属性类都实现IDataErrorInfo接口。这样,WPF的数据绑定验证机制才能通过索引器调用FluentValidation的验证器,从而在UI上实时显示错误信息。
保存按钮的可用性依赖整体验证
在StudentViewModel中,SaveCommand的CanExecute由_validator.Validate(this).IsValid决定。作者通过订阅ViewModel自身、CurrentStudent以及Fields中每个Field的PropertyChanged事件,在属性变化时触发验证并调用SaveCommand.RaiseCanExecuteChanged()。这意味着只有所有输入都通过验证,保存按钮才可用,从而防止无效提交。
两种错误提示样式的实现差异
文章提供了两种错误样式:ErrorStyle1在输入框右侧显示红色感叹号图标,并通过ToolTip显示错误信息;ErrorStyle2则在输入框旁直接显示红色错误文本,并改变输入框背景色。两者都通过Validation.ErrorTemplate和触发器实现,但ErrorStyle2更直观地展示错误内容,适合需要即时反馈的场景。
Q&A
FluentValidation 是什么?它能在 WPF 中使用吗?
FluentValidation 是一个基于 .NET 的开源验证框架,支持链式操作、自定义验证器和多语言本地化,常与 MVC、WebApi 等集成。它也可以用于 WPF 的属性验证,本文即介绍如何在 WPF 中应用。
在 WPF 中使用 FluentValidation 需要让类实现什么接口?
需要让实体类和 ViewModel 都实现 IDataErrorInfo 接口,并在索引器中调用验证器进行验证,这样 WPF 绑定才能触发并显示错误信息。
如何用 FluentValidation 验证 ViewModel 中的复杂属性(如对象属性和集合属性)?
在 ViewModel 的验证器中,对于对象属性使用 RuleFor(vm => vm.CurrentStudent).SetValidator(new StudentValidator());对于集合属性使用 RuleForEach(vm => vm.Fields).SetValidator(new FieldValidator())。同时 ViewModel 和子属性类都要实现 IDataErrorInfo 接口。
FluentValidation 在 WPF 中如何实现保存按钮的启用/禁用控制?
在 ViewModel 中注册属性变化事件(包括自身、复杂属性和集合项),在事件处理程序中调用验证器的 Validate 方法,根据结果设置 _isCanExecuteSaveCommand,并调用 SaveCommand.RaiseCanExecuteChanged() 更新按钮状态。
文章提供了哪两种错误提示样式?如何定义?
第一种是红色边框样式(ErrorStyle1),通过 Validation.ErrorTemplate 定义红色边框和错误图标;第二种是右键文字提示样式(ErrorStyle2),在错误模板中显示错误文本,并改变背景色等。两种样式均在 App.xaml 中定义。
在哪里可以获取本文的完整源码?
源码已同步到 Gitee 和 GitHub:Gitee 地址 https://gitee.com/dotnet9/FluentValidationForWpf,GitHub 地址 https://github.com/dotnet9/FluentValidationForWPF。