Практическое руководство. Реализация проверки привязки
В этом примере показано, как использовать ErrorTemplate и триггер стиля для предоставления визуальной обратной связи, чтобы уведомить пользователя при вводе недопустимого значения в зависимости от пользовательского правила проверки.
Пример
Текстовое содержимое TextBox в следующем примере привязано к свойству Age
(типа int) объекта источника привязки с именем ods
. Привязка настроена на использование правила проверки с именем 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
В следующем примере показано, ControlTemplate validationTemplate
как создать красный восклицательный знак, чтобы уведомить пользователя об ошибке проверки. Шаблоны элементов управления используются для переопределения внешнего вида элемента управления.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Как показано в следующем примере, 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>
Объект данных
Следующий фрагмент кода — это объект данных, используемый в предыдущих примерах кода. Экземпляр создается в 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.
См. также
.NET Desktop feedback