此示例演示如何使用 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。