【最佳实践系列】一种WPF应用程序数据验证模式

原创 2015年11月15日 14:22:13

输入数据的验证经常发生在用户录入数据后,在对输入数据进行处理前对其进行检验,确定其是否满足一定的规则。这里介绍一种经验法则,用于频繁的数据验证过程。

注:下面的例子用到一个用于表示均匀分布参数设置信息的类

    /// <summary>
    /// 均匀分布类
    /// </summary>
    public class UniformDistribution
    {
        public double LowerLimit { get; set; }
        public double UpperLimit { get; set; }
        public UniformDistribution(double lw, double up)
        {
            LowerLimit = lw;
            UpperLimit = up;
        }
    }

1、定义一个验证返回类型VerifyResult,其中包含一个int类型的故障码,一个string类型的故障消息,以及一个作为返回值的对象。

    /// <summary>
    /// 验证返回结果类
    /// </summary>
    public class VerifyResult
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public object ReturnedValue { get; set; }
        public bool IsPass
        {
            get { return Code == 0; }
        }
        //构造函数
        public VerifyResult()
        {
            Code = 0; //默认0为通过验证标识
            Message = string.Empty;
            ReturnedValue = null;
        }
    }

2、定义一个类包装验证方法库,由简到繁实现层次化的数据验证

    /// <summary>
    /// 验证方法库类
    /// </summary>
    public class Verifier
    {
        //基本验证:输入正实数
        public static VerifyResult PositiveNumberVerifer(string content)
        {
            VerifyResult result = new VerifyResult();
            double value = 0;
            if (!double.TryParse(content, out value))
            {
                //浮点数解析失败则添加相应错误信息
                result.Code = -1; //给定一个错误码
                result.Message = "请输入数值...";
            }
            else if (value < 0)
            {
                //解析成功但为负数,同样添加相应错误信息
                result.Code = -2; 
                result.Message = "请输入一个正数...";
            }
            else
                result.ReturnedValue = value;
            return result;
        }

        //组合验证器
        public static VerifyResult UniformSettingVerifer(string lowerLimitStr, string upperLimitStr)
        {
            VerifyResult result = new VerifyResult();
            //调用低层次验证器作数字验证
            VerifyResult lowerLimitResult = PositiveNumberVerifer(lowerLimitStr);
            VerifyResult upperLimitResult = PositiveNumberVerifer(upperLimitStr);
            //补充组合验证法则
            if (lowerLimitResult.Code < 0)
            {
                result.Code = -1;
                //组合错误消息
                result.Message = "下限设置格式有误!" + lowerLimitResult.Message;
            }
            else if (upperLimitResult.Code < 0)
            {
                result.Code = -2;
                result.Message = "上限设置格式有误!" + upperLimitResult.Message;
            }
            else if (lowerLimitResult.Code == 0 && upperLimitResult.Code == 0)
            {
                //高层次验证
                if ((double)lowerLimitResult.ReturnedValue > (double)upperLimitResult.ReturnedValue)
                {
                    result.Code = -3;
                    result.Message = "下限值不能大于上限值...";
                }
                else
                {
                    //所有验证通过,构造返回值对象
                    result.ReturnedValue = new UniformDistribution((double)lowerLimitResult.ReturnedValue,
                        (double)upperLimitResult.ReturnedValue);
                }
            }
            return result;
        }
    }
3、在应用程序中使用输入数据前调用相应的验证函数对数据进行检查,若不返回错误码则继续下一步的处理,否则应通过MessageBox显示错误信息

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //测试数据验证功能:界面中包含两个文本框tbLowerLimit和tbUpperLimit
            var verify = Verifier.UniformSettingVerifer(tbLowerLimit.Text, tbUpperLimit.Text);
            if (verify.IsPass)
            {
                //使用输入的数据
                var uniform = verify.ReturnedValue as UniformDistribution;
                MessageBox.Show("通过验证");
            }
            else
            {
                MessageBox.Show(verify.Message);
            }
        }
当然,这种方法可以作为WPF数据绑定的验证技术的一部分,实现更完善的验证功能,例如错误信息突出显示等。

WPF默认数据绑定可以自动进行数据格式验证

界面的TextBox控件绑定了后台的CLR属性,属性是float类型的,当在文本框中输入一个不能转换成float类型的数据时,将不会把错误的数值更新到后台的属性当中。...
  • wudong121
  • wudong121
  • 2016-12-16 20:17:15
  • 159

WPF( 数据验证)

  • haifengzhilian
  • haifengzhilian
  • 2013-04-09 15:04:38
  • 2006

WPF数据验证(6)—— IDataErrorInfo + DataAnnotations

前面介绍过居于 IDataErrorInfo 接口的数据验证。利用 IDataErrorInfo 的好处是它可用于轻松地处理交叉耦合属性。但也具有一个很大的弊端:索引器的实现通常会导致较大的 swit...
  • iHuoBaby
  • iHuoBaby
  • 2013-02-07 20:47:22
  • 983

WPF数据验证(5)—— 错误模板

  • iHuoBaby
  • iHuoBaby
  • 2013-02-07 20:02:40
  • 1013

【WPF】MVVM模式下的输入校验(IDataErrorInfo + DataAnnotations)

【前言】 Windows Presentation Foundation (WPF) 具有一个丰富数据绑定系统。除了作为通过 Model-View-ViewModel (MVVM) 模式从支持逻辑和...
  • liuruxin
  • liuruxin
  • 2014-08-11 19:34:19
  • 1230

理解和使用WPF 验证机制

首先建立一个demo用以学习和实验WPF Data Validation机制。创建一个数据实体类: public class Employee {     public string Nam...
  • gentle_wolf
  • gentle_wolf
  • 2013-06-20 11:15:37
  • 8322

WPF数据验证(4)——响应与获取验证错误

前面的示例中,有关用户接受到错误的唯一指示是在违反规则的文本框周围的红色轮廓。为了提供更多信息,可以处理 Error 事件,但存储或清除错误时会引发该事件,但前提是必须确保已将 Binding.Not...
  • iHuoBaby
  • iHuoBaby
  • 2013-02-07 18:38:22
  • 1849

使用 WPF 构建复合应用程序的模式

内容摘要:在本文中,我将对复合应用程序的定义进行解释,并说明如何才能构建一个利用 WPF 功能的复合应用程序。随后,我还会为您介绍 Microsoft 模式和实施方案小组提供的全新 WPF 复合应用程...
  • jackywxs
  • jackywxs
  • 2009-10-03 10:15:00
  • 699

C#控制台程序,Winform,WPF的区别

我用下来,感觉有以下几个大区别:WPF的线程模型和winform的线程模型不同WPF到处用到数据绑定,winform在列表中才用的多WPF支持3D,winform本身没有,需要引入托管的DXWPF有现...
  • fucong920618717
  • fucong920618717
  • 2017-04-17 15:45:03
  • 2562
收藏助手
不良信息举报
您举报文章:【最佳实践系列】一种WPF应用程序数据验证模式
举报原因:
原因补充:

(最多只允许输入30个字)