WAF验证框架全面指南:ValidatableModel与INotifyDataErrorInfo最佳实践 WAF验证框架全面指南ValidatableModel与INotifyDataErrorInfo最佳实践【免费下载链接】wafWin Application Framework (WAF) is a lightweight Framework that helps you to create well structured XAML Applications.项目地址: https://gitcode.com/gh_mirrors/waf/wafWin Application Framework (WAF) 是一个轻量级框架专为创建结构良好的XAML应用程序而设计。在WAF中数据验证是构建可靠应用的核心环节而ValidatableModel与INotifyDataErrorInfo的结合使用为开发者提供了强大且灵活的验证解决方案。本文将详细介绍这两个组件的最佳实践帮助你轻松实现高效的数据验证逻辑。为什么选择ValidatableModelValidatableModel是WAF框架中实现INotifyDataErrorInfo接口的基础类它为数据模型提供了完整的验证支持。相比传统的验证方式ValidatableModel具有以下优势开箱即用的验证功能无需手动实现INotifyDataErrorInfo接口的所有成员高效的错误跟踪自动维护错误状态并触发变更通知与WPF完美集成支持数据绑定验证提供即时反馈灵活的验证触发支持属性级和对象级验证ValidatableModel核心功能解析1. 基本结构与接口实现ValidatableModel继承自Model类并实现了INotifyDataErrorInfo接口其核心代码位于src/System.Waf/System.Waf/System.Waf.Core/Foundation/ValidatableModel.cs。该类主要包含以下成员HasErrors指示实体是否有验证错误的属性Errors获取所有错误的只读列表GetErrors(string propertyName)获取指定属性或实体级别的验证错误ErrorsChanged当验证错误发生变化时触发的事件Validate()执行对象和属性验证的方法2. 验证流程与错误管理ValidatableModel的验证流程主要通过以下步骤实现调用Validate()方法触发完整的对象验证使用ValidationHelper执行数据注解验证更新错误字典维护属性与错误的映射关系触发变更通知当错误状态变化时通知UI关键代码片段展示了错误更新逻辑private void UpdateErrors(IEnumerableValidationResult validationResults) { var newErrors new Dictionarystring, ListValidationResult(); // 处理验证结果并更新错误字典 // ... if (changedProperties.Count 0) { errors ErrorsDictionary.Values.SelectMany(x x).Distinct().ToArray(); HasErrors ErrorsDictionary.Count 0; RaisePropertyChanged(nameof(Errors)); } foreach (var changedProperty in changedProperties) RaiseErrorsChanged(changedProperty); }INotifyDataErrorInfo接口深度理解INotifyDataErrorInfo是.NET提供的用于数据验证的标准接口它允许对象在属性或整体验证状态发生变化时通知客户端。WAF的ValidatableModel通过实现此接口提供了以下核心能力实时错误通知通过ErrorsChanged事件通知UI错误状态变化分层错误访问支持获取特定属性或整个对象的错误信息与XAML绑定集成WPF自动识别实现此接口的对象并显示验证错误最佳实践使用ValidatableModel的完整指南1. 创建可验证模型创建自定义模型时只需继承ValidatableModel并添加数据注解特性public class Contact : ValidatableModel { private string name; [Required(ErrorMessage 姓名不能为空)] [StringLength(50, ErrorMessage 姓名不能超过50个字符)] public string Name { get name; set SetPropertyAndValidate(ref name, value); } }2. 触发验证的三种方式自动属性验证使用SetPropertyAndValidate方法在属性变更时自动验证手动对象验证调用Validate()方法执行完整对象验证实现IValidatableObject添加自定义验证逻辑public class Person : ValidatableModel, IValidatableObject { // 属性定义... public IEnumerableValidationResult Validate(ValidationContext validationContext) { if (Age 18 HasDrivingLicense) { yield return new ValidationResult(未成年人不能拥有驾照, new[] { nameof(Age), nameof(HasDrivingLicense) }); } } }3. 在XAML中显示验证错误WPF可以自动检测实现INotifyDataErrorInfo的对象并通过Validation.ErrorTemplate显示错误TextBox Text{Binding Name, ValidatesOnNotifyDataErrorsTrue} Validation.ErrorTemplate ControlTemplate StackPanel AdornedElementPlaceholder / TextBlock Text{Binding [0].ErrorContent} ForegroundRed / /StackPanel /ControlTemplate /Validation.ErrorTemplate /TextBox4. 处理实体级错误除了属性级错误ValidatableModel还支持实体级错误不特定于某个属性的错误public IEnumerableValidationResult Validate(ValidationContext validationContext) { if (StartDate EndDate) { yield return new ValidationResult(开始日期不能晚于结束日期); } }常见问题与解决方案性能优化对于包含大量属性的复杂模型可通过以下方式优化验证性能只在必要时触发验证使用[ValidationAttribute]的AllowMultiple特性组合验证规则实现部分验证逻辑验证状态同步当模型间存在依赖关系时可重写OnErrorsChanged方法实现跨模型验证状态同步protected override void OnErrorsChanged(DataErrorsChangedEventArgs e) { base.OnErrorsChanged(e); if (e.PropertyName nameof(Address)) { RelatedModel?.Validate(); } }实际应用案例在WAF示例项目中ValidatableModel被广泛应用于各种场景地址簿模块src/System.Waf/Samples/InformationManager/AddressBook.Modules.Domain/Contact.cs电子邮件客户端src/System.Waf/Samples/InformationManager/EmailClient.Modules.Domain/Emails/Email.cs图书库应用src/System.Waf/Samples/BookLibrary/BookLibrary.Library.Domain/Book.cs这些示例展示了如何在实际项目中有效利用ValidatableModel进行数据验证。总结WAF的ValidatableModel结合INotifyDataErrorInfo提供了一套完整的数据验证解决方案使开发者能够轻松实现强大的验证逻辑。通过本文介绍的最佳实践你可以构建出更健壮、用户体验更好的XAML应用程序。无论是简单的表单验证还是复杂的业务规则验证ValidatableModel都能满足你的需求让数据验证变得简单而高效。【免费下载链接】wafWin Application Framework (WAF) is a lightweight Framework that helps you to create well structured XAML Applications.项目地址: https://gitcode.com/gh_mirrors/waf/waf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考