对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为View添加事件代码监听这类错误事件, 然后进行处理。
这样做可以说是非常简单, 但是这样的硬编码的, 基本上每个模块每个功能, 你都必不可少的为其进行重复的工作, 这是一项非常枯燥且无聊的体力活!
于是, 则考虑MVVM的架构中, 如何把这种模式传递到ViewModel中, 使得前端的验证, 对于ViewModel仍然有效。
实现的原理, 如图所示:
override void OnAttached() { //附加对象时,给对象增加一个监听验证错误事件的能力,注意该事件是冒泡的 this.AssociatedObject.AddHandler(Validation.ErrorEvent, new EventHandler<ValidationErrorEventArgs>(this.OnValidationError)); } #region 获取实现接口的对象 /// <summary> /// 获取对象 /// </summary> /// <returns></returns> private IValidationExceptionHandler GetValidationExceptionHandler() { if (this.AssociatedObject.DataContext is IValidationExceptionHandler) { var handler = this.AssociatedObject.DataContext as IValidationExceptionHandler; return handler; } return null; } #endregion #region 验证事件方法 /// <summary> /// 验证事件 /// </summary> /// <param name="sender"></parfxjHMGKsgam> /// <param name="e"></param> private void OnValidationError(object sender, ValidationErrorEventArgs e) { try { var handler = GetValidationExceptionHandler(); var element = e.OriginalSource as UIElement; if (handler == null || element == null) return; if (e.Action == ValidationErrorEventAction.Added) { _validationExceptionCount++; } else if (e.Action == ValidationErrorEventAction.Removed) { _validationExceptionCount--; } handler.IsValid = _validationExceptionCount == 0; } catch (Exception ex) { throw ex; } } #endregion }
4. View容器最外层注册添加的监听错误事件 ValidationExceptionBehavior
<i:Interaction.Behaviors> <domain:ValidationExceptionBehavior></domain:ValidationExceptionBehavior> </i:Interaction.Behaviors>
5. ViewModel 通过实现 IValidationExceptionHandler 来获取前端的验证结果
根据前端验证的结果, 正确保存, 错误进行提示
public override void Save() { if (!this.IsValid) { MessageBox.Show("输入的格式有误,请重新输入!"); return; } base.Save(); }效果:

到此这篇关于WPF使用ValidationRules对MVVM架构数据验证的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








