Binding的ValidationRules属性类型是Collection<ValidationRule>,可以为每个Binding这只多个数据校验条件,
每个条件是一个ValidationRule类型对象。ValidationRule类是抽象类,使用时创建派生类并实现Validate方法。
在UI上绘制一个TextBox和一个Slider,将其关联,Slider的取值范围0-100。
<StackPanel>
<TextBox x:Name="txtBox1" Margin="5"/>
<Slider x:Name="slider1" Minimum="-10" Maximum="100" Margin="5" />
</StackPanel>
为了进行校验,需要一个ValidationRule的派生类:
public class RangeValidationRule : ValidationRule
{
//需要实现Validate方法
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 Failed");
}
}
然后在窗体的构造器建Binding
Binding binding = new Binding("Value") { Source = this.slider1 };
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
RangeValidationRule rvr = new RangeValidationRule();
rvr.ValidatesOnTargetUpdated = true;//检测来自Source的数据是否有问题
binding.ValidationRules.Add(rvr);
this.txtBox1.SetBinding(TextBox.TextProperty, binding);
在发生错误是若要提示该错误信息需要将binding.NotifyOnValidationError 设为true
Binding binding = new Binding("Value") { Source = this.slider1 };
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
RangeValidationRule rvr = new RangeValidationRule();
rvr.ValidatesOnTargetUpdated = true;
binding.ValidationRules.Add(rvr);
binding.NotifyOnValidationError = true;
this.txtBox1.SetBinding(TextBox.TextProperty, binding);
this.txtBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(this.ValidationError));
void ValidationError(object sender, RoutedEventArgs e)
{
if (Validation.GetErrors(this.txtBox1).Count>0)
{
this.txtBox1.ToolTip = Validation.GetErrors(this.txtBox1)[0].ErrorContent.ToString();
}
}