注意需要 ValidatesOnTargetUpdated设置为True 还需要注意的是Binding对验证结果的处理

时间:2022-02-18 04:48:08

WPF的Binding使得数据能够在数据源和方针之间畅通,在数据畅通的中间,便能够对数据做一些措置惩罚惩罚。
数据转换和数据验证等于在数据从源到方针 or 从方针到源 的时候对数据的验证和转换。

注意需要 ValidatesOnTargetUpdated设置为True 还需要注意的是Binding对验证结果的处理

ValidationRule 验证法则

WPF*给了一个抽象类ValidationRule,我们自界说的验证法则都需要担任它,然后实现它的抽象
要领Validate,该要领需要返回一个ValidationResult东西来暗示验证功效。举个例子,一个验证数字
的法则(输入的只能是数字)

public class NumberValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { if (Regex.IsMatch(value.ToString(), "^[0-9]+$")) { return new ValidationResult(true, null); } else { return new ValidationResult(false, "请输入数字"); } } }

此中ValidationRule的两个属性

ValidatesOnTargetUpdated

该属性可以确定验证的标的目的,如果设置为false,那么只验证从方针到源的标的目的,如果为True,
那么同时也会验证从源到方针的标的目的

ValidationStep
该属性确定了验证的时机,它是一个枚举值
1 CommittedValue,该值提交到数据源后,运行ValidationRule,即不管验证是否能通过,属性城市被更新
2 ConvertedProposedValue,在进行了转换之后,运行ValidationRule,如果有数据转换,那么先转换再验证
3 RawProposedValue,在任何转换产生之前,运行ValidationRule
4 UpdatedValue,在更新了源后,运行ValidationRule,即属性值被变动之后,就会去验证,注意需要
ValidatesOnTargetUpdated设置为True

还需要注意的是Binding对验证功效的措置惩罚惩罚,NotifyOnValidationError设置为True,即当产生验证
错误时,错误信息会从方针沿着可视树往上冒泡,直到该冒泡事件被侦听到并被措置惩罚惩罚。

<TextBox Grid.Row="1"> <TextBox.Text> <Binding Path="Number" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource Converter}" NotifyOnValidationError="True"> <Binding.ValidationRules> <validationRules:NumberValidationRule ValidatesOnTargetUpdated="True" ValidationStep="CommittedValue"></validationRules:NumberValidationRule> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>

当呈现验证错误时,TextBox就会有一个红色的框,这是默认的错误模板样式,我们如何界说一个错误模板(ErrorTemplate)呢

错误模板 ErrorTemplate <ControlTemplate x:Key="ErrorTemplate"> <StackPanel Orientation="Horizontal"> <AdornedElementPlaceholder x:Name="Placeholder"></AdornedElementPlaceholder> <TextBlock Foreground="Red" Text="{Binding ElementName=Placeholder,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" FontSize="20" x:Name="txt"></TextBlock> </StackPanel> </ControlTemplate> <TextBox Grid.Row="1" Height="30" Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">

AdornedElementPlaceholder暗示一个占位符,这里暗示具体的控件即TextBox,这里暗示错误模板的构造是
如果有验证错误,那么在TextBox的后边会有一个TextBlock文本,文本的内容显示的是验证错误的信息。

Validation

这里涉及到了一个类Validation,,它是一个静态类,它的使用大多以附加属性呈现。它的主要成果是
1 设置ErrorTemplate
2 判断是否有错误(HasError),以及获取错误列表(Errors)
3 侦听验证错误事件

前两点前面都有提到,此刻来看下 侦听验证错误冒泡事件

<Grid Grid.Row="1" Validation.Error="Validation_OnError"> <TextBox Height="30" Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"> <TextBox.Text> <Binding Path="Number" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"> <Binding.ValidationRules> <validationRules:NumberValidationRule></validationRules:NumberValidationRule> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> </Grid> private void Validation_OnError(object sender, ValidationErrorEventArgs e) { if (e.Action == ValidationErrorEventAction.Added) { //todo:新的验证错误 _errorMessage = e.Error.ErrorContent.ToString(); } else { //todo:断根原有错误 _errorMessage = string.Empty; } }