WPF 结合Prism框架的ErrorsContainer的数据验证,要求将相关代码封装到Viewmodel基类里,基类继承BiandableBase

时间: 2024-03-08 22:46:29 浏览: 17
在使用 Prism 框架进行 WPF 开发时,可以使用 `ErrorsContainer` 类来进行数据验证。`ErrorsContainer` 类是一个 Prism 框架提供的数据验证类,可以将数据验证错误信息保存在 `Errors` 字典中,并且可以绑定到 UI 上进行显示。 以下是将 `ErrorsContainer` 封装到 View Model 基类里的代码示例: ```csharp using Prism.Mvvm; using Prism.Commands; using Prism.Validation; public abstract class BaseViewModel : BindableBase, IValidatableBindableBase { protected ErrorsContainer<string> errorsContainer; public BaseViewModel() { errorsContainer = new ErrorsContainer<string>(OnErrorsChanged); } public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; public System.Collections.IEnumerable GetErrors(string propertyName) { return errorsContainer.GetErrors(propertyName); } public bool HasErrors { get { return errorsContainer.HasErrors; } } protected virtual void OnErrorsChanged([CallerMemberName] string propertyName = null) { ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName)); } protected void ValidateProperty<T>(Expression<Func<T>> propertyExpression, T value) { var propertyName = ((MemberExpression)propertyExpression.Body).Member.Name; errorsContainer.ClearErrors(propertyName); Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = propertyName }); } protected void ValidateObject() { errorsContainer.ClearErrors(); Validator.ValidateObject(this, new ValidationContext(this, null, null)); } protected bool SetPropertyAndValidate<T>(ref T field, T value, Expression<Func<T>> propertyExpression) { if (EqualityComparer<T>.Default.Equals(field, value)) { return false; } field = value; RaisePropertyChanged(propertyExpression); ValidateProperty(propertyExpression, value); return !HasErrors; } } ``` 在这个基类中,我们继承了 Prism.Mvvm 中的 `BindableBase` 类,并实现了 `IValidatableBindableBase` 接口。在构造函数中,我们初始化了 `ErrorsContainer` 对象,并将 `OnErrorsChanged` 方法作为参数传入。`OnErrorsChanged` 方法会在数据验证错误信息发生变化时被调用,我们可以在这个方法中更新 UI。 在 `GetErrors` 方法中,我们通过传入的属性名来获取对应的验证错误信息。在 `HasErrors` 属性中,我们判断当前是否存在验证错误信息。 在 `ValidateProperty` 方法中,我们通过传入的属性表达式和属性值来进行属性验证,并将验证结果保存到 `ErrorsContainer` 中。在 `ValidateObject` 方法中,我们通过对整个对象进行验证,并将验证结果保存到 `ErrorsContainer` 中。 最后,在 `SetPropertyAndValidate` 方法中,我们通过传入的字段引用、属性表达式和属性值来进行属性赋值并进行验证。 使用这个基类的子类在进行数据验证时,只需要在属性的 set 方法中调用 `SetPropertyAndValidate` 方法,并传入对应的字段引用、属性表达式和属性值即可。同时,在 UI 中绑定数据时,需要使用 `ErrorsContainer` 中的 `GetErrors` 方法来获取对应的错误信息,并将结果绑定到 UI 上进行显示。

相关推荐

最新推荐

recommend-type

Prism7.1.0.431_WPF_官方中文文档.docx

主要靠机器翻译,后来人工矫正文档。设计和构建灵活且易于维护的丰富WPF客户端应用程序可能具有挑战性。本节介绍了构建WPF客户端应用程序时可能遇到的一些常见挑战,并介绍了Prism如何帮助您应对这些挑战。
recommend-type

WPF获得PNG图片外观Path数据.docx

WPF获得PNG图片转为外观Path数据:主要是把图片png格式转为WPF使用的path格式使用,可以快速解决,程序员自己画图的能力。
recommend-type

在WPF中动态加载XAML中的控件实例代码

主要介绍了在WPF中动态加载XAML中的控件,实例分析了WPF中针对XAML中控件的动态调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
recommend-type

WPF实现ScrollViewer滚动到指定控件处

主要为大家详细介绍了WPF实现ScrollViewer滚动到指定控件处,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C#中WPF ListView绑定数据的实例详解

主要介绍了C#中WPF ListView绑定数据的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。