如何实现绑定验证

此示例演示如何使用 ErrorTemplate 样式触发器提供视觉反馈,以根据自定义验证规则在输入无效值时通知用户。

示例:

以下示例中的文本内容TextBox绑定到名为ods的绑定源对象的Age属性,其类型为 int。 绑定设置为使用命名 AgeRangeRule 的验证规则,以便当用户输入非数字字符或小于 21 或大于 130 的值时,文本框旁边会显示一个红色感叹号,当用户将鼠标移到文本框上时,将显示带有错误消息的工具提示。

<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 ods}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <local:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

下面的示例展示了AgeRangeRule的实现,它继承自ValidationRule并重写了Validate方法。 该方法 Int32.Parse 在值上调用,以确保它不包含任何无效字符。 该方法 Validate 返回一个 ValidationResult 值,该值指示值是否有效,具体取决于是否在分析期间捕获异常,以及年龄值是否超出下限和上限。

public class AgeRangeRule : ValidationRule
{
    public int Min { get; set; }
    public int Max { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = int.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, $"Illegal characters or {e.Message}");
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              $"Please enter an age in the range: {Min}-{Max}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

以下示例显示了创建红色感叹号以通知用户验证错误的自定义 ControlTemplatevalidationTemplate 。 控件模板用于重新定义控件的外观。

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

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

<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>

数据对象

以下代码片段是前面的代码示例中使用的数据对象。 实例在 XAML 中创建为静态资源,其键为 ods

public class MyDataSource
{
    public MyDataSource()
    {
        Age = 0;
        Age2 = 0;
    }

    public int Age { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
}
Public Class MyDataSource
    Public Sub New()
        Me.Age = 0
        Me.Age2 = 0
    End Sub

    Public Property Age As Integer
    Public Property Age2 As Integer
    Public Property Age3 As Integer
End Class

完整示例

有关完整示例,请参阅 绑定验证示例

请注意,如果未提供自定义 ErrorTemplate ,则当出现验证错误时,将显示默认错误模板向用户提供视觉反馈。 有关详细信息,请参阅 数据绑定概述 中的“数据验证”。 此外,WPF 还提供内置验证规则,用于捕获在绑定源属性更新期间引发的异常。 有关详细信息,请参阅 ExceptionValidationRule

另请参阅