WPF学习笔记:Binding对数据的校验

在我们给控件的某个属性赋值或者当控件的某个属性值改变时,我们可能会需要检查这个值是不是在规定的范围内。如果这个值不在规定的范围内,我们需要给出提示。WPF中实现这个功能的类是ValidationRule。先看一个例子吧:

xaml代码:


    
        
        
    

c#代码:

public MainWindow()
        {
            InitializeComponent();

            Binding binding = new Binding("Value") { Source = slider1 };
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            binding.NotifyOnValidationError = true;

            RangeValidationRule rangeValidationRule = new RangeValidationRule();
            binding.ValidationRules.Add(rangeValidationRule);
            rangeValidationRule.ValidatesOnTargetUpdated = true;

            textBox1.SetBinding(TextBox.TextProperty, binding);

            textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError));
        }

        void ValidationError(object sender,RoutedEventArgs e)
        {
            if(Validation.GetErrors(textBox1).Count>0)
            {
                var errMessage = (e as ValidationErrorEventArgs).Error.ErrorContent.ToString();
                textBox1.ToolTip = errMessage;
            }
        }

校验规则类:

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

大家对ValidationRule转到定义可以看到,这个一个抽象类,Validate是一个抽象方法,必须由它的子类实现检验的规则,由它的子类来决定什么样的数据是合法的,什么是不合法的。我们这里定义了类继承自ValidationRule,并实现了抽象方法。

Validate方法的目标控件是slider1,它规定slider1的值在0-100之间是合法的,否则就是不合法的。

那Binding是如何和ValidationRule关联起来的呢?binding.ValidationRules.Add(rangeValidationRule);这条语句实现了他们之间的关联,从这条语句可以看出,一个Binding可以设置多个校验规则。

rangeValidationRule.ValidatesOnTargetUpdated = true;这条语句的的作用是当目标控件的属性值(binding指定)改变时,rangeValidationRule就会执行Validate方法进行校验。如果把属性值设置为false,则rangeValidationRule不会校验。

binding.NotifyOnValidationError = true;这个语句的作用是当rangeValidationRule检验数据不合法时,是不是要通知binding。

当binding接收到数据不合法时,就会调用textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError))这条语句指定数据不合法的处理函数。如果binding.NotifyOnValidationError = false则ValidationError函数不会执行。

我们再来看看数据检验失败时指定的处理函数ValidationError。当数据检验失败时我们返回了"Validation Range Failed"这个字符串类型的错误信息。那么我们把RoutedEventArgs通过多态转换成ValidationErrorEventArgs,因为后者是继承自前者,所以这里的转换是成功的。ToolTip这个属性的作用是:当我们把鼠标移动到这个文本框时,会在鼠标旁边显示错误信息,如图:

 

 

 

 

你可能感兴趣的:(WPF)