• Binding的数据校验


      Binding用于数据有效性校验的是ValidationRules属性,ValidationRules的类型是Collection<ValidationRule>,可以为Binding设置多个数据校验条件,每个条件是一个ValidationRule类型对象。

      ValidationRule是一个抽象类,在使用的时候我们需要创建它的派生类并实现它的Validate方法。

      Validate方法的返回值是一个ValidationResult类型的对象,如果校验通过,就把ValidationResult对象的IsValid属性设置为true,反之,需要把IsValid属性设置为false并未其ErrorContent属性设置一个合适的消息内容。

      下面我们在UI上绘制一个TextBox和Slider,然后再C#代码里使用Binding把他们关联起来,以Slider为源,TextBox为目标,Slider的取值范围是0到100,XAML代码如下:

    <TextBox x:Name="txt_Value" Margin="10"></TextBox>
     <Slider x:Name="slider" Maximum="100" Minimum="0"></Slider>

      为进行校验,准备一个校验类,代码如下:

        public class RangeValidationRule:ValidationRule
        {
    
            public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
            {
                double d = 0;
                if(double.TryParse(value.ToString(),out d))
                {
                    if(d>=0 && d<=100)
                    {
                        return new ValidationResult(true, null);
                    }
                }
                return new ValidationResult(false, "Validation Error");
    
            }
        }

      然后再窗体的构造函数里建立Binding,代码如下:

                Binding b = new Binding("Value"){Source=this.slider};
                b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                var r = new RangeValidationRule();
                b.ValidationRules.Add(r);
                this.txt_Value.SetBinding(TextBox.TextProperty, b);

      运行程序就会发现,当输入0到100之间的数值时程序正常显示,但输入这个区间之外的数值或输入不能被解析的值时,TextBox会显示红色的边框,表示值是错误的,不能把它传递个Source。

      Binding进行校验时默认是认为来自Source的数据总是正确的,只有来自Target的数据才有可能有问题,即只在Target数据被外部方法更新时进行校验,而Source数据更新Target时是不会进行校验的。如果想改变这种默认行为就需要将属性ValidatesOnTargetUpdated设置为true。

      如果想显示ValidationResult的ErrorContent,可以使用路由事件。首先将Binding的NotifyOnValidationError属性设置为true,这样当数据校验失败时Binding就会发出报警信号,这个信号会在以Binding对象的Target为起点的UI元素树上传播。信号每到达一个结点,如果这个结点上设置有针对这种信号的侦听器(事件处理器),那么这个侦听器就会被触发用以处理这个信号。

      建立Binding的代码如下:

                Binding b = new Binding("Value"){Source=this.slider};
                b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                var r = new RangeValidationRule();
                r.ValidatesOnTargetUpdated = true;
                b.ValidationRules.Add(r);
                b.NotifyOnValidationError = true;
                this.txt_Value.SetBinding(TextBox.TextProperty, b);
                this.txt_Value.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(this.ValidationError));    

      事件处理代码如下:

            private void ValidationError(object sender, RoutedEventArgs e)
            {
                if(Validation.GetErrors(this.txt_Value).Count>0)
                {
                    this.txt_Value.ToolTip = Validation.GetErrors(this.txt_Value)[0].ErrorContent.ToString();
                }
            }

     

  • 相关阅读:
    转:windows通过VNC访问远程ubuntu14.04 【 server】服务器
    【转】研究了代码质量后,开发速度提高了2倍,bug减少了15倍
    【转】PuTTY的ppk密钥与OpenSSH密钥之间的相互转换
    【转】outlook配置腾讯企业邮箱(腾讯企业邮箱imap服务器地址)
    【转】YApi结合swag管理和生成go项目restful API文档
    [转] 超高效!SwaggerYapi的秘密
    【转】SSH 远程登录很慢的解决方法
    [转]go语言io reader_如何从io.Reader 中读数据
    eslint 支持多个三目表达式
    33
  • 原文地址:https://www.cnblogs.com/yijiaoyingbi/p/4866183.html
Copyright © 2020-2023  润新知