欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#WPF# 数据校验

程序员文章站 2022-06-07 18:06:06
...

当填写表单时,需要对填写的内容进行验证,检查数据是否符合要求,比如字符串的长度、日期的格式、数字等。WPF支持自定义验证规则,并提供可视化反馈,以便在输入无效值时向用户发出通知。

下面的示例将演示一个模拟员工信息录入的过程,如果年龄不再给定的输入范围内,将在文本框的后面显示一个红色的叹号,当鼠标移至错误文本框时,显示提示消息,提示用户正确的输入格式。

主要内容为:自定义验证规则、定义输入错误时控件的外观、定义样式触发器显示错误提示

自定义验证规则

可以继承ValidationRule类,重写Validate方法,实现自定义的验证规则

下面是年龄的验证规则的实现:

#WPF# 数据校验
 
    public class AgeRangeRule : ValidationRule
    {
        private int _min;
        private int _max;

        public AgeRangeRule()
        {

        }

        public int Min
        {
            get { return _min; }
            set { _min = value; }
        }

        public int Max
        {
            get { return _max; }
            set { _max = value; }
        }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            int age = 0;
            try
            {
                if (((string)value).Length > 0)
                    age = Int32.Parse((String)value);
            }
            catch (Exception e)
            {
                return new ValidationResult(false, "输入的数字无效!");
            }

            if ((age < Min) || (age > Max))
            {
                return new ValidationResult(false,
                  "输入的年龄范围必须在: " + Min + " - " + Max + "之间");
            }
            else
            {
                return new ValidationResult(true, null);
            }
        }
    }
 
其中ValidationRule的两个属性

ValidatesOnTargetUpdated

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

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

还需要注意的是Binding对验证结果的处理,NotifyOnValidationError设置为True,即当发生验证
错误时,错误信息会从目标沿着可视树往上冒泡,直到该冒泡事件被侦听到并被处理。

定义输入错误时控件的外观

自定义的 ControlTemplate,它用于创建一个红色感叹号,以通知用户验证错误。 控件模板用于重新定义控件的外观。

 
<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <AdornedElementPlaceholder/>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
  </DockPanel>
</ControlTemplate>

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

 

定义样式触发器显示错误提示

显示错误消息的 ToolTip 是使用名为 textBoxInError 的样式创建的。 如果 HasError 的值是 true,则触发器将当前 TextBox 的工具提示设置为其第一个验证错误。 RelativeSource 设置为 Self,以引用当前元素。

 
<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>
 

 

控件绑定相应的模板和样式

 
<TextBox Name="textBox1" Width="50" FontSize="15"
         Validation.ErrorTemplate="{StaticResource validationTemplate}"
         Style="{StaticResource textBoxInError}"
         Grid.Row="1" Grid.Column="1" Margin="2">
  <TextBox.Text>
    <Binding Path="Age" Source="{StaticResource employee}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
 

Validation

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

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

当输入的年龄不在定义范围内时,控件的显示方式如下:

#WPF# 数据校验

注:当数据绑定验证时,如果验证规则的ValidationStep属性设置为RawProposedValue或ConvertedProposedValue值时,在验证失败的情况下,数据不会更新到源,这也在情理之中,不合格的数据我们当然不接受。

相关标签: WPF