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>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

W poniższym przykładzie pokazano implementację AgeRangeRulemetody , 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 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 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

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. W celu uzyskania więcej informacji, zobacz następujący temat: ExceptionValidationRule.

Zobacz też