WPF使用ValidationRules对MVVM架构数据验证

2022-04-16 21:03:26

对于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架构数据验证

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