Jak implementować powiązaną walidację
W tym przykładzie ErrorTemplate pokazano, jak za pomocą wyzwalacza stylu i przekazać wizualną opinię w celu poinformowania użytkownika o wprowadzeniu nieprawidłowej wartości na podstawie niestandardowej reguły weryfikacji.
Przykład
Zawartość tekstowa obiektu w TextBox poniższym przykładzie Age jest powiązana z właściwością (typu int) obiektu źródłowego powiązania o nazwie ods. AgeRangeRule Powiązanie jest ustawione tak, aby używać reguły weryfikacji o nazwie , tak aby jeśli użytkownik wprowadzi znaki nieliczbowe lub wartość mniejszą niż 21 lub większą niż 130, obok pola tekstowego pojawi się czerwony wykrzyknik, a obok pola tekstowego pojawi się etykietka narzędzia z komunikatem o błędzie, gdy użytkownik przesuwa wskaźnik myszy 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>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
W poniższym przykładzie pokazano implementację AgeRangeRule, która dziedziczy z ValidationRule metody i zastępuje Validate metodę . Metoda Int32.Parse jest wywoływana dla wartości , aby upewnić się, że nie zawiera ona żadnych nieprawidłowych znaków. Metoda Validate zwraca wartość ValidationResult , która wskazuje, czy wartość jest prawidłowa na podstawie tego, czy podczas analizowania jest przechwycony wyjątek oraz czy wartość wieku jest poza dolną i górną granicą.
public class AgeRangeRule : ValidationRule
{
public int Min { get; set; }
public int Max { get; set; }
public AgeRangeRule()
{
}
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, $"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 kod ControlTemplatevalidationTemplate , który tworzy czerwony wykrzyknik w celu powiadomienia użytkownika o błędzie walidacji. 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, komunikat ToolTip o błędzie jest tworzony przy użyciu stylu o nazwie textBoxInError. Jeśli wartość to HasErrortrue, wyzwalacz ustawia etykietkę narzędzia bieżącego na TextBox swój pierwszy błąd walidacji. Element RelativeSource jest ustawiony na 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)/ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Aby uzyskać kompletny przykład, zobacz Przykład weryfikacji powiązania.
Pamiętaj, że jeśli nie poimkniesz niestandardowego szablonu ErrorTemplate błędu domyślnego, zostanie wyświetlony komunikat o błędzie wizualnym dla użytkownika w przypadku wystąpienia błędu walidacji. Aby uzyskać więcej informacji, zobacz "Walidacja danych" w tece Omówienie powiązań danych. Ponadto WPF udostępnia wbudowaną regułę weryfikacji, która przechwytuje wyjątki zgłaszane podczas aktualizacji właściwości źródła powiązania. Aby uzyskać więcej informacji, zobacz ExceptionValidationRule.