wpf devexpress 使用IDataErrorInfo实现input验证

此处下载源码

当form初始化显示,Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据,form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口(System.ComponentModel)MSDN文章

查阅IDataErrorInfo接口实现在RegistrationViewModel类

[POCOViewModel]
public class RegistrationViewModel : IDataErrorInfo {
    ...
    string IDataErrorInfo.Error {
         get {
            IDataErrorInfo me = (IDataErrorInfo)this;
            string error =
                me[BindableBase.GetPropertyName(() => FirstName)] +
                me[BindableBase.GetPropertyName(() => LastName)] +
                me[BindableBase.GetPropertyName(() => Email)] +
                me[BindableBase.GetPropertyName(() => Password)] +
                me[BindableBase.GetPropertyName(() => ConfirmPassword)] +
                me[BindableBase.GetPropertyName(() => Birthday)];
            if (!string.IsNullOrEmpty(error))
                return "Please check inputted data.";
            return null;
        }
    }
    string IDataErrorInfo.this[string columnName] {
        get {
            string firstNameProp = BindableBase.GetPropertyName(() => FirstName);
            string lastNameProp = BindableBase.GetPropertyName(() => LastName);
            string emailProp = BindableBase.GetPropertyName(() => Email);
            string passwordProp = BindableBase.GetPropertyName(() => Password);
            string confirmPasswordProp = BindableBase.GetPropertyName(() => ConfirmPassword);
            string birthdayProp = BindableBase.GetPropertyName(() => Birthday);
            string genderProp = BindableBase.GetPropertyName(() => Gender);
            if (columnName == firstNameProp) {
                if (FirstName == null || string.IsNullOrEmpty(FirstName))
                    return string.Format("You cannot leave the {0} field empty.", firstNameProp);
            } else if (columnName == lastNameProp) {
                if (LastName == null || string.IsNullOrEmpty(LastName))
                    return string.Format("You cannot leave the {0} field empty.", lastNameProp);
            } else if (columnName == emailProp) {
                if (Email == null || string.IsNullOrEmpty(Email))
                    return string.Format("You cannot leave the {0} field empty.", emailProp);
            } else if (columnName == passwordProp) {
                if (Password == null || string.IsNullOrEmpty(Password))
                    return string.Format("You cannot leave the {0} field empty.", passwordProp);
            } else if (columnName == confirmPasswordProp) {
                if (!string.IsNullOrEmpty(Password) && Password != ConfirmPassword)
                    return "These passwords do not match. Please try again.";
            } else if (columnName == birthdayProp) {
                if (Birthday == null || string.IsNullOrEmpty(Birthday.ToString()))
                    return string.Format("You cannot leave the {0} field empty.", birthdayProp);
            } else if (columnName == genderProp) {
                if (Gender == -1)
                    return string.Format("You cannot leave the {0} field empty.", genderProp);
            }
            return null;
        }
    }
}

启动IDataErrorInfo验证在XAML设置Binding.ValidatesOnDataErrors参数为true。设置绑定参数对于每一个form内的编辑器,包括ConfirmPassword编辑器

<dxlc:LayoutControl ... >
   ...
    <dxe:TextEdit NullText="FIRST" ValidateOnEnterKeyPressed="True" ValidateOnTextInput="False">
        <dxe:TextEdit.EditValue>
            <Binding Path="FirstName" ValidatesOnDataErrors="True"
                     UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"/>
        </dxe:TextEdit.EditValue>
    </dxe:TextEdit>
   ...
   <dxe:PasswordBoxEdit EditValue="{Binding ConfirmPassword, ValidatesOnDataErrors=True}" 
                        ValidateOnEnterKeyPressed="True" ValidateOnTextInput="True"/>
   ...
</dxlc:LayoutControl>

如果现在运行sample,将验证error当应用程序开始。

此问题是相关于输入验证IDataErrorInfo接口实现。修复此问题,重要验证错误没有返回在ViewModel如果一个用户没有点击注册按钮。

[POCOViewModel]
public class RegistrationViewModel : IDataErrorInfo {
    ...
    public void AddEmployee() {
        string error = EnableValidationAndGetError();
        if(error != null) return;
        EmployeesModelHelper.AddNewEmployee(FirstName, LastName, Email, Password, Birthday.Value);
    }

    bool allowValidation = false;
    string EnableValidationAndGetError() {
        allowValidation = true;
        string error = ((IDataErrorInfo)this).Error;
        if(!string.IsNullOrEmpty(error)) {
            this.RaisePropertiesChanged();
            return error;
        }
        return null;
    }
    string IDataErrorInfo.Error {
        get {
            if(!allowValidation) return null;
            ...
        }
    }
    string IDataErrorInfo.this[string columnName] {
        get {
            if(!allowValidation) return null;
            ...
        }
    }
}

RegistrationViewModel没有返回一个错误直到用户点击注册按钮。输入数据有一个错误如果用户点击Register,不需要点击记录执行ViewModel验证逻辑在EnableValidationAndGetError方法。注意EnableValidationAndGetError调用RaisePropertiesChanged。此方法通常调用指南潜在数据更改;在这种情况,一个直线需要初始化验证进程。

验证几乎完成。剩余问题是Password字段。当用户修改Password字段,ConfirmPassword字段没有反应。你可以调用RaisePropertyChanged方法对于ConfirmPassword字段当Password字段更改。

[POCOViewModel]
public class RegistrationViewModel : IDataErrorInfo {
    ...
    public virtual string Password { get; set; }
    public virtual string ConfirmPassword { get; set; }
    ...
    protected void OnPasswordChanged() {
        this.RaisePropertyChanged(x => x.ConfirmPassword);
    }
    ...
}

必须显示一个消息指示当注册成功和失败。DevExpress.Xpf.Mvvm库提供一个服务机制在Mvvm支持这些任务。

使用服务,首先需要定义一个服务显示消息框。DXMessageBoxService已经定义在MainView等级。取回服务从RegistrationViewModel,使用GetService<T>扩展方法。

[POCOViewModel]
public class RegistrationViewModel : IDataErrorInfo {
    ...
    public void AddEmployee() {
        string error = EnableValidationAndGetError();
        if(error != null) {
            OnValidationFailed(error);
            return;
        }
        EmployeesModelHelper.AddNewEmployee(FirstName, LastName, Email, Password, Birthday.Value);
        OnValidationSucceeded();
    }
    void OnValidationSucceeded() {
        this.GetService<IMessageBoxService>().Show("Registration succeeded", "Registration Form", MessageBoxButton.OK);
    }
    void OnValidationFailed(string error) {
        this.GetService<IMessageBoxService>().Show("Registration failed. " + error, "Registration Form", MessageBoxButton.OK);
    }
    ...
}

代码之上声明两个方法-OnValidationSucceeded和OnValidationFailed-调用验证成功和失败,分别。这些方法获得IMessageBoxService服务定义在视图。服务接口提供Show方法显示方法框。

结果显示如下。

用户离开编辑框空白区域或者无效输入数据,这些相应消息将显示。

输入数据正确,用户通知注册成功完成。

此时,注册form是对于所有意图和目的,完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/208288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微机原理——定时器学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253&#xff1a;&#xff08;内部采用的是16位 减法计数器&#xff09; 8253内部结构框图 8253命令字 8253有三个命令字&#xff1a;方式命…

【广州华锐视点】VR云端看车:一键穿越!VR技术让你在家就能试驾各种豪车!

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在汽车行业&#xff0c;VR线上看车已经成为了一种全新的购车体验。通过这种创新的方式&#xff0c;消费者可以在不出门的情况下&#xff0c;全方位地了解汽车的外观、内饰和性能…

PGSQL(PostgreSQL)数据库安装教程

安装包下载 下载地址 下载后点击exe安装包 设置的data存储路径 设置密码 设置端口 安装完毕&#xff0c;配置PGSQL的ip远程连接&#xff0c;pg_hba.conf&#xff0c;postgresql.conf&#xff0c;需要更改这两个文件 pg_hba.conf 最后增加一行 host all all …

1+x网络系统建设与运维(中级)-练习题

一.给设备重命名 同理可得&#xff0c;所有交换机和路由器都用一下命令配置 <Huawei>sys [Huawei]sysn LSW1 二.配置VLAN LSW1&#xff1a; [LSW1]vlan batch 10 20 [LSW1]int e0/0/1 [LSW1-Ethernet0/0/1]port link-type access [LSW1-Ethernet0/0/1]port default vlan…

P1012 [NOIP1998 提高组] 拼数( 字典序 )

字典序&#xff1a; 在字典中&#xff0c;单词是按照首字母在字母表中的顺序进行排列的 比如 alpha 在 beta 之前。 1.而第一个字母相同时&#xff0c;会 去比较两个单词的第二个字母在字母表中的顺序&#xff0c;比如 account 在 advanced 之前&#xff0c;以此类推。 2. 若…

2023年中国金融科技研究报告

第一章 行业概况 1.1 定义 金融科技&#xff08;FinTech, Financial Technology&#xff09;代表了金融和技术的交汇。这一领域虽然处于发展的初期阶段&#xff0c;但已经展现出深远的影响力。金融科技的业务模式多样&#xff0c;涵盖了从传统金融服务的数字化转型到新兴技术…

使用Xshell启动远程服务器上的tensorboard:本地浏览器打开

在远程服务器上启动的tensorboard产生的localhost网址用本地浏览器一般不能直接打开&#xff0c;我们需要建立本地PC与远程服务器的通信&#xff0c;将tensorboard的映射端口与本地端口连接起来&#xff08;参考解决方案&#xff09;。 一、连接远程服务器设置 二、添加SSH隧道…

MySQL实现(免密登录)

简介: MySQL免密登录是一种允许用户在没有输入密码的情况下直接登录到MySQL服务器的配置。这通常是通过在登录时跳过密码验证来实现的。 1、修改MySQL的配置文件 使用vi /etc/my.cnf&#xff0c;添加到【mysqld】后面 skip-grant-tables #配置项告诉mysql跳过权限验证&#…

运算放大器和常见运放电路

关于运算放大器 运算放大器(Operational Amplifier), 简称运放, 是一种直流耦合, 差模输入, 单端输出(Differential-in, single-ended output)的高增益电压放大器件. 运放能产生一个比输入端电势差大数十万倍的输出电势. 因为刚发明时主要用于加减法等运算电路中, 因而得名运算…

flutter 自定义TabBar 【top 0 级别】

flutter 自定义TabBar 【top 0 级别】 前言一、基础widget二、tab 标签三、barView总结 前言 在日常开发中&#xff0c;tab 标签选项&#xff0c;是一个我们特别常用的一个组件了&#xff0c;往往我们在一个项目中&#xff0c;有很多地方会使用到它&#xff0c;每次单独去写&am…

ESP32-Web-Server编程- 使用表格(Table)实时显示设备信息

ESP32-Web-Server编程- 使用表格&#xff08;Table&#xff09;实时显示设备信息 概述 上节讲述了通过 Server-Sent Events&#xff08;以下简称 SSE&#xff09; 实现在网页实时更新 ESP32 Web 服务器的传感器数据。 本节书接上会&#xff0c;继续使用 SSE 机制在网页实时显…

python中的字符串

字符串 字符串是编程语言中的一种基本数据类型&#xff0c;用于表示一串字符序列。在Python中&#xff0c;字符串是不可变的&#xff0c;也就是说一旦字符串被创建&#xff0c;就无法修改其中的字符。 Python中的字符串可以用单引号或双引号括起来&#xff0c;例如&#xff1…

当异步任务汇聚,你该如何选择:CountDownLatch 与 CompletableFuture 对比

当我们需要执行多个异步任务&#xff0c;并且需要等待它们全部完成才可以继续时&#xff0c;可以使用以下两种实现方案&#xff1a; 一、方案 方案一&#xff1a;CountDownLatch CountDownLatch是一个同步工具类&#xff0c;可以用来实现多个线程之间的同步。它可以让一个线程…

2023最新软件测试八股文,你背得怎样了

今天给大家分享软件测试面试题基础篇&#xff0c;看看大家能答对几题 1、软件测试方法有哪些分类?各自有什么特点?设计测试用例的主要方法有哪些? 白盒: 测试人员利用程序内部的逻辑结构及相关信息&#xff0c;设计或选择型试用例:对程序所有的逻辑路径进行测试。 黑盒: …

【C++】异常抛出变量的生命周期

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

【Java8系列07】Java8日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

java+springboot学生宿舍公寓管理系统xueshenggongy

经过查阅资料和调查统计发现&#xff0c;高校学生宿舍管理工作变得越来越繁重和琐碎&#xff0c;如在学生住宿安排&#xff08;特别是新生住宿安排&#xff09;、宿舍大幅调换、公共设施统计维护、宿舍杂费统计收取、宿舍卫生管理统计、出入登记记录等各个方法存在着大量问题和…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

二叉树展开为链表的三种写法

二叉树展开为链表 链表头节点法 新建一个树形链表&#xff0c;前序遍历这个树&#xff0c;遍历到一个节点就往里插 class Solution {TreeNode dummyNode new TreeNode(0,null,null);TreeNode p dummyNode;public void flatten(TreeNode root) {if(root null) return;//线序…

Hi-Net:用于多模态MR图像合成的混合融合网络

Hi-Net: Hybrid-Fusion Network for Multi-Modal MR Image Synthesis Hi-Net&#xff1a;用于多模态MR图像合成的混合融合网络背景贡献实验方法the modality-specific network&#xff08;模态特定网络&#xff09;multi-modal fusion networkmulti-modal synthesis network 损…