WPF 结合Prism框架的ErrorsContainer的数据验证,要求将相关代码封装到Viewmodel基类里,基类继承BiandableBase
时间: 2024-03-08 10:46:29 浏览: 126
在使用 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 上进行显示。
阅读全文