WPF MVVM从入门到精通8:数据验证

到目前为止,登录窗口的基本功能似乎都完成了。但我们知道,很多时候用户名的格式是有要求的,例如是只有字母数字下划线,或者字数有限制。这要求我们在登录之前,验证输入内容的正确性。在这一节,我们需要验证用户名和密码的正确性,如果上面两个框的输入非法,禁用登录按钮。

在数据验证错误的时候,我们显示一个叹号在输入框的旁边,如下图所示:

数据验证的方法有很多,我们使用了一种比较优雅的。

首先定义一些验证属性:

    using System.ComponentModel.DataAnnotations;
     
    namespace LoginDemo.ViewModel.Login
    {
        public class NotEmptyCheck : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                var name = value as string;
                if (string.IsNullOrEmpty(name))
                {
                    return false;
                }
                return true;
            }
     
            public override string FormatErrorMessage(string name)
            {
                return "不能为空";
            }
        }
     
        public class UserNameExists : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                var name = value as string;
                if (name.Contains("abc"))
                {
                    return true;
                }
                return false;
            }
     
            public override string FormatErrorMessage(string name)
            {
                return "用户名必须包含abc";
            }
        }
    }

第一个验证属性要求宿主的内容不能为空,第二个验证属性要求内容必须含有abc这个字符串。

然后我们又要用到Behavior了。当绑定的内容校验出异常后,它会一起冒泡,只到Window。这时候,Window的Behavior接收到异常,做出相应的处理。

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Interactivity;
     
    namespace LoginDemo.ViewModel.Common
    {
        /// <summary>
        /// 验证异常行为
        /// </summary>
        public class ValidationExceptionBehavior : Behavior<FrameworkElement>
        {
            /// <summary>
            /// 记录异常的数量
            /// </summary>
            /// <remarks>在一个页面里面,所有控件的验证错误信息都会传到这个类上,每个控制需不需要显示验证错误,需要分别记录</remarks>
            private Dictionary<UIElement, int> ExceptionCount;
            /// <summary>
            /// 缓存页面的提示装饰器
            /// </summary>
            private Dictionary<UIElement, NotifyAdorner> AdornerDict;
     
            protected override void OnAttached()
            {
                ExceptionCount = new Dictionary<UIElement, int>();
                AdornerDict = new Dictionary<UIElement, NotifyAdor

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值