Jak implementować powiązaną walidację
W tym przykładzie pokazano, jak używać ErrorTemplate wyzwalacza stylu i, aby przekazać wizualną opinię, aby poinformować użytkownika o wprowadzeniu nieprawidłowej wartości na podstawie niestandardowej reguły walidacji.
Przykład
Zawartość tekstowa obiektu TextBox w poniższym przykładzie jest powiązana z Age
właściwością (typu int) obiektu źródłowego powiązania o nazwie ods
. Powiązanie jest skonfigurowane do używania reguły walidacji o nazwie AgeRangeRule
tak, aby jeśli użytkownik wprowadzi znaki nieliczbowe lub wartość mniejszą niż 21 lub większą niż 130, czerwony wykrzyknik pojawia się obok pola tekstowego i wskazówka narzędzia z komunikatem o błędzie pojawia się, gdy użytkownik przenosi mysz nad polem tekstowym.
<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>
W poniższym przykładzie pokazano implementację AgeRangeRule
metody , która dziedziczy metodę ValidationRule i zastępuje ją Validate . Metoda Int32.Parse
jest wywoływana na wartości, aby upewnić się, że nie zawiera żadnych nieprawidłowych znaków. Metoda Validate zwraca wartość wskazującą ValidationResult , czy wartość jest prawidłowa na podstawie tego, czy wyjątek jest przechwycony podczas analizowania i czy wartość wieku znajduje się poza dolną i górną granicą.
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
W poniższym przykładzie pokazano niestandardowy ControlTemplatevalidationTemplate
, który tworzy czerwony wykrzyknik, aby powiadomić użytkownika o błędzie weryfikacji. Szablony kontrolek służą do ponownego definiowania wyglądu kontrolki.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Jak pokazano w poniższym przykładzie, ToolTip komunikat o błędzie jest tworzony przy użyciu stylu o nazwie textBoxInError
. Jeśli wartość HasError to true
, wyzwalacz ustawia wskazówkę narzędzia bieżącego TextBox na pierwszy błąd weryfikacji. Parametr RelativeSource ma wartość Self, odwołując się do bieżącego elementu.
<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>
Obiekt danych
Poniższy fragment kodu to obiekt danych używany w poprzednich przykładach kodu. Wystąpienie jest tworzone w języku XAML jako zasób statyczny z kluczem 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
Kompletny przykład
Pełny przykład można znaleźć w artykule Bind Validation sample (Przykład weryfikacji powiązania).
Należy pamiętać, że jeśli nie podasz niestandardowego ErrorTemplate domyślnego szablonu błędu, pojawi się, aby przekazać użytkownikowi opinię wizualną, gdy wystąpi błąd weryfikacji. Aby uzyskać więcej informacji, zobacz "Weryfikacja danych" w temacie Omówienie powiązania danych. Ponadto platforma WPF udostępnia wbudowaną regułę sprawdzania poprawności, która przechwytuje wyjątki zgłaszane podczas aktualizacji właściwości źródłowej powiązania. Aby uzyskać więcej informacji, zobacz ExceptionValidationRule.
Zobacz też
.NET Desktop feedback