数据绑定(九)Binding的数据校验

Binding用ValidationRules属性来校验数据的有效性,ValidationRules属性类型是Collection<ValidationRule>,他可以设置多个数据校验条件,ValidationRule是抽象类,使用的时候需要创建它的派生类并实现它的Validate方法,Validate方法的返回值是ValidationResult类型对象,如果校验通过,就把ValidationResult对象的IsValid属性设为true,反之,设为false,并为其ErrorContent属性设置一个合法的消息内容

界面代码

 

[html] view plain copy
 
  1. <TextBox x:Name="textBox1" Margin="5"></TextBox>  
  2. <Slider x:Name="slider1" Minimum="0" Maximum="100" Margin="5" />  

TextBox用于设置滚动条的值,需要对TextBox中的值进行校验,首先需要准备一个校验类

 

 

[csharp] view plain copy
 
  1. class RangeValidationRule : ValidationRule  
  2. {  
  3.     public override ValidationResult Validate(object value, CultureInfo cultureInfo)  
  4.     {  
  5.         double d = 0;  
  6.         if (double.TryParse(value.ToString(), out d))  
  7.         {  
  8.             if ((0 <= d) && (d <= 100))  
  9.             {  
  10.                 return new ValidationResult(true, null);  
  11.             }  
  12.         }  
  13.   
  14.         return new ValidationResult(false, "输入值非法");  
  15.     }  
  16. }  

然后在后台代码中建立这样的Binding

 

 

[csharp] view plain copy
 
  1. Binding binding = new Binding();  
  2. binding.Source = slider1;  
  3. binding.Path = new PropertyPath("Value");  
  4. binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;  
  5. RangeValidationRule rvr = new RangeValidationRule();  
  6. binding.ValidationRules.Add(rvr);  
  7. textBox1.SetBinding(TextBox.TextProperty, binding);  

Binding进行校验时的默认行为是认为来自Source的数据始终是正确的,只有来自Target的数据才有可能有问题,为了不让有问题的数据污染Source所以需要校验,所以,Binding只有在Target被外部方法更新时校验数据,而来自Binding的Source数据更新Target时是不会进行校验的。如果想在Target改变Source数据时也进行校验,就需要将验证条件的ValidatesOnTargetUpdated属性设置为true。

 

修改前台代码为

 

[html] view plain copy
 
  1. <StackPanel>  
  2.     <TextBox x:Name="textBox1" Margin="5"></TextBox>  
  3.     <Slider x:Name="slider1" Minimum="-10" Maximum="10" Margin="5" />  
  4. </StackPanel>  

绑定增加一行代码

 

 

[csharp] view plain copy
 
  1. Binding binding = new Binding();  
  2. binding.Source = slider1;  
  3. binding.Path = new PropertyPath("Value");  
  4. binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;  
  5. RangeValidationRule rvr = new RangeValidationRule();  
  6. <strong>rvr.ValidatesOnTargetUpdated = true;</strong>  
  7. binding.ValidationRules.Add(rvr);  
  8. textBox1.SetBinding(TextBox.TextProperty, binding);  

当滑块拖动到负值时,TextBox显示校验失败

 

校验失败时,ValidationResult对象携带了一条错误消息,想要显示这条消息,首先在创建Binding时要把Binding对象的NotifyOnValidationError属性设置为true

 

 
 

posted on 2017-07-26 09:16  alex5211314  阅读(142)  评论(0编辑  收藏  举报

导航