iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >WPF使用ValidationRules对MVVM架构数据验证
  • 619
分享到

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

2024-04-02 19:04:59 619人浏览 八月长安
摘要

对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为Vi

对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为View添加事件代码监听这类错误事件, 然后进行处理。

这样做可以说是非常简单, 但是这样的硬编码的, 基本上每个模块每个功能, 你都必不可少的为其进行重复的工作, 这是一项非常枯燥且无聊的体力活!

于是, 则考虑MVVM的架构中, 如何把这种模式传递到ViewModel中, 使得前端的验证, 对于ViewModel仍然有效。

实现的原理, 如图所示:

在此之前, 对于View前端验证需要做的一些操作步骤,

  • 1.为验证的属性添加自定义验证类
  • 2.设置验证错误的通知属性 NotifyOnValidationError="True" 。 注: 如此一来, 则可以产生Validation.ErrorEvent事件
  • 3.通过自定义的 ValidationExceptionBehavior 继承于 Behavior, 用于监听 Validation.ErrorEvent 的错误事件。
  • 4.在 ValidationExceptionBehavior 中通过 AssociatedObjectde的DataContex获取到关联当前View的DataContex, 从而改变DataContext的后端验证条件。

1.设置属性自定义的验证类并添加 NotifyOnValidationError="True" 属性

                        <TextBox  Margin="15 0 10 0" 
                                 Style="{StaticResource MaterialDesignFloatingHintTextBox}"  materialDesign:HintAssist.Hint="登录名 *">
                            <TextBox.Text>
                                <Binding Path="Model.Account" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                                    <Binding.ValidationRules>
                                        <domain:CustomizeValidationRule validationType="Str" 
                                                                        minLength="3" maxLength="10"
                                                                        errORMessage="输入长度范围 [3-10]字" 
                                                                        ValidatesOnTargetUpdated="True" />
                                    </Binding.ValidationRules>
                                </Binding>
                            </TextBox.Text>
                        </TextBox>

2.自定义 IValidationExceptionHandler 接口, ViewModel继承IValidationExceptionHandler , 用于接收前端的验证结果。

public interface IValidationExceptionHandler
    {
        /// <summary>
        /// 是否有效
        /// </summary>
        bool IsValid
        {
            get;
            set;
        }
    }

3. 自定义 ValidationExceptionBehavior, 用于监听处理View的错误事件

    /// <summary>
    /// 验证行为类,可以获得附加到的对象
    /// </summary>
    public class ValidationExceptionBehavior : Behavior<FrameworkElement>
    {
        /// <summary>
        /// 错误计数器
        /// </summary>
        private int _validationExceptionCount = 0;
        
        /// <summary>
        /// 附加对象时
        /// </summary>
        protected 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"></param>
        /// <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架构数据验证的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: WPF使用ValidationRules对MVVM架构数据验证

本文链接: https://www.lsjlt.com/news/164068.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WPF使用ValidationRules对MVVM架构数据验证
    对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为Vi...
    99+
    2024-04-02
  • WPF框架Prism中使用MVVM架构
    常见的MVVM框架 众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知、绑...
    99+
    2024-04-02
  • JavaScript MVVM 架构:数据绑定和用户交互
    MVVM 架构概述 MVVM(模型-视图-视图模型)架构是一种设计模式,将应用程序的模型、视图和视图模型分离。模型表示应用程序状态和逻辑,视图负责显示数据,而视图模型充当模型和视图之间的桥梁,处理数据转换和用户交互。 数据绑定 MVVM...
    99+
    2024-03-03
    MVVM、数据绑定、用户交互、JavaScript、AngularJS、KnockoutJS
  • GoFrame框架数据校验之校验对象校验结构体
    目录前言摘要基本概念方法介绍简要说明注意问题TIPS链式操作示例1:单数据校验简单示例进阶示例进阶示例打印结果示例2:Map数据校验示例3:Struct数据校验总结前言摘要 这篇文章...
    99+
    2024-04-02
  • python库JsonSchema验证JSON数据结构使用详解
    目录简单实例type关键字object关键字属性 properties必需属性大小数组属性itemsList validationTuple validation长度唯一性通用关键字...
    99+
    2024-04-02
  • python中怎么使用JsonSchema库验证JSON数据结构
    这篇文章主要介绍“python中怎么使用JsonSchema库验证JSON数据结构”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么使用JsonSchema库验证JSON数据结构”文章...
    99+
    2023-06-30
  • 基于Php+MySql数据库架构的网络验证系统
    介绍: 炸鸡网络验证系统基于Php+MySql数据库架构的网络验证系统,安全稳定、性能强悍、 承载能力强,支持高并发、高承载、多线路,支持服务器集群架设,高性能设计,速度非常快,效率非常高。 客户端支持VC、VB、DELPHI、易语言、C#...
    99+
    2023-10-09
    php 数据库架构 网络验证系统 php网络验证系统
  • 如何使用weui.topTips验证数据
    这篇文章主要为大家展示了“如何使用weui.topTips验证数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用weui.topTips验证数据”这篇文...
    99+
    2024-04-02
  • 怎么使用PHP正则对表单数据进行验证
    这篇文章主要介绍了怎么使用PHP正则对表单数据进行验证,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何使用PHP正则对表单数据进行验证?首先,我们先布局我们的HTML的表单...
    99+
    2023-06-15
  • Java对数器验证算法怎么使用
    本文小编为大家详细介绍“Java对数器验证算法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java对数器验证算法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。对数器验证算法的正确性对数器介绍有...
    99+
    2023-07-06
  • Express框架中_router对象数据结构如何使用
    这篇文章主要介绍了Express框架中_router对象数据结构如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Express框架中_router对象数据结构如何使用文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 如何使用 STL 函数对象来进行数据验证和转换?
    使用 stl 函数对象可简化数据验证和转换。验证函数对象返回布尔值,表示数据是否有效;转换函数对象返回新值。这些函数对象可应用于数据容器,实现数据验证和转换,例如验证是否大于 10 并将...
    99+
    2024-04-25
    stl 函数对象
  • 如何使用 PHP 函数进行数据验证?
    php 提供了数据验证函数来检查变量类型 (e.g. is_int()、is_string()),并提供了过滤器函数来转换和验证数据 (e.g. filter_var()、filter_...
    99+
    2024-05-03
    数据验证 php函数
  • C#使用Data Annotations进行手动数据验证
    Data Annotations是在Asp.Net中用于表单验证的,它通过Attribute直接标记字段的有效性,简单且直观。在非Asp.Net程序中(如控制台程序),我们也可以使用...
    99+
    2024-04-02
  • ASP.NET数据验证控件CustomValidator的使用浅析
    CustomValidator是ASP.NET中的一种验证控件,用于对用户输入的数据进行自定义验证。它可以使用客户端脚本或服务器端代...
    99+
    2023-09-23
    ASP.NET
  • 使用PHP的filter_var()函数验证用户输入的数据
    在现代的网站开发中,前端验证已经成为了标配,但是这并不能完全保证数据的安全性,因为用户提交的数据可能会被恶意攻击者篡改或者绕过前端验证。为了增强网站的安全性,我们需要在后台服务器端进行数据验证,PHP提供了filter_var()函数来帮助...
    99+
    2023-11-04
    PHP filter_var() 验证数据
  • 如何使用 PHP 内置函数进行数据验证?
    如何使用 php 内置函数进行数据验证?php 内置了大量函数用于验证各种数据类型,包括:数字:is_numeric()、filter_var()字符串:strlen()、empty()...
    99+
    2024-04-23
    数据验证 php
  • 如何在PHP中使用数据可信性验证函数
    随着互联网应用的普及,对数据安全的要求越来越高。在PHP开发中,如何保证传输数据的可信性是一个非常重要的问题。为此,在PHP中提供了一系列的函数和类来保证数据的可信性,其中包括数据可信性验证函数。本文将介绍如何在PHP中使用数据可信性验证函...
    99+
    2023-05-21
    函数 PHP 数据可信性验证
  • 使用PHP的filter_input()函数验证单个用户输入的数据
    使用PHP的filter_input()函数验证单个用户输入的数据在开发Web应用程序时,用户输入的数据安全性是非常重要的。为了防止恶意攻击和漏洞,我们需要对用户输入的数据进行严格的验证和过滤。PHP的filter_input()函数提供了...
    99+
    2023-11-04
    数据 验证 输入
  • 如何使用PHP和Vue实现数据验证功能
    概述:在开发Web应用程序时,数据验证是一个非常重要的环节,它可以保护我们的应用程序免受无效或恶意输入的影响。本文将介绍如何使用PHP和Vue框架来实现强大的数据验证功能。我们将使用PHP后端来接收和处理前端发送的数据,并使用Vue的表单验...
    99+
    2023-10-21
    VUE PHP 数据验证功能
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作