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.

Zobacz też