Condividi tramite


Procedura: implementare la convalida dell'associazione

In questo esempio viene illustrato come usare un ErrorTemplate trigger di stile e per fornire feedback visivo per informare l'utente quando viene immesso un valore non valido, in base a una regola di convalida personalizzata.

Esempio

Il contenuto di testo di TextBox nell'esempio seguente è associato alla Age proprietà (di tipo int) di un oggetto di origine di associazione denominato ods. Il binding è configurato per l'uso di una regola di convalida denominata AgeRangeRule in modo che, se l'utente immette un carattere non numerico o un valore minore di 21 o maggiore di 130, appare un punto esclamativo rosso accanto alla casella di testo e viene visualizzata una descrizione comando con il messaggio di errore quando l'utente sposta il puntatore del mouse sulla casella di testo.

<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>

Nell'esempio seguente viene illustrata l'implementazione di AgeRangeRule, che eredita da ValidationRule ed esegue l'override del Validate metodo . Il Int32.Parse metodo viene chiamato sul valore per assicurarsi che non contenga caratteri non validi. Il Validate metodo restituisce un valore ValidationResult che indica se il valore è valido in base alla presenza di un'eccezione durante l'analisi e se il valore di età non rientra nei limiti inferiori e superiori.

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

Nell'esempio seguente viene illustrato l'oggetto personalizzato ControlTemplate validationTemplate che crea un punto esclamativo rosso per notificare all'utente un errore di convalida. Vengono usati modelli specifici per ridefinire l'aspetto di un controllo.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Come illustrato nell'esempio seguente, l'oggetto ToolTip che mostra il messaggio di errore viene creato usando lo stile denominato textBoxInError. Se il valore di HasError è true, il trigger imposta la descrizione comando dell'oggetto corrente TextBox sul primo errore di convalida. l'oggetto RelativeSource è impostato su Self, che fa riferimento all'elemento corrente.

<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>

Oggetto dati

Il frammento di codice seguente è l'oggetto dati usato negli esempi di codice precedenti. Un'istanza viene creata nel codice XAML come risorsa statica con la chiave di 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

Esempio completo

Per l'esempio completo, vedere Esempio di convalida dell'associazione.

Si noti che se non si fornisce un modello di errore predefinito personalizzato ErrorTemplate viene visualizzato per fornire un feedback visivo all'utente quando si verifica un errore di convalida. Per altre informazioni, vedere "Convalida dei dati" in Panoramica sul data binding. WPF fornisce inoltre una regola di convalida predefinita che intercetta le eccezioni generate durante l'aggiornamento della proprietà di origine dell'associazione. Per ulteriori informazioni, vedere ExceptionValidationRule.

Vedi anche