Validare i dati con i ValidationRule

di Cristian Civera, in Windows Presentation Foundation, XAML,

Una delle novità più importanti presenti in Windows Presentation Foundation è costituita dalle funzionalità di Binding che, forti dell'esperienza proveniente da WinForms, si dimostrano ancora più potenti e flessibili.

Nelle applicazioni che fanno uso di dati l'uso del Binding è quindi obbligatorio e molto probabilmente si presenta anche la necessita di validare i dati immessi dall'utente.
A tale scopo l'oggetto Binding dispone di una proprietà ValidationRules, una collezione di classi astratte ValidationRule che hanno il compito di processare il valore immesso e indicare se è valido o meno. Sebbene è consigliabile implementare queste logiche a livello di entità, in modo indipendente dalla tecnologia di presentazione che si sta usando, i ValidationRule permettono sia un ulteriore filtro per vincolare il tipo del dato che la proprietà di destinazione può accettare, sia un modo per conoscere e mostrare gli errori riscontrati nell'entità. Per esempio l'interfaccia System.ComponentModel.IDataErrorInfo è nata per questo scopo e può essere usata per fornire informazioni di validazione.

L'esempio che segue mostra un'ipotetica classe di validazione di interi:

public class Int32ValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        // Controllo che il valore non sia nullo
        if (value != null)
        {
            Int32 result;
            // Se è già un numero o un numero valido
            if (value is Int32 || Int32.TryParse(value.ToString(), out result))
                return ValidationResult.ValidResult;
        }

        // In tutti gli altri casi il valore non è un numero
        return new ValidationResult(false, "Valore non valido");
    }
}

L'implementazione è abbastanza semplice e consiste nell'implementare il metodo Validate e restituire un tipo ValidateResult che contiene l'esito e un oggetto d'errore che può essere poi usato per i messaggi di notifica.

Per utilizzare la classe occorre inserirla nella collezione ValidationRules dell'oggetto Binding. Il markup che segue mostra una TextBox e un TextBlock che indica il numero inserito. In caso di validazione fallita la TextBox automaticamente viene bordata di rosso:

<TextBox>
  <TextBox.Text>
    <Binding Path="Text" ElementName="number">
      <Binding.ValidationRules>
        <local:Int32ValidationRule />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

<!-- Label per mostrare il numero -->
<TextBlock Grid.Row="1">
  <TextBlock>Numero: </TextBlock>
  <TextBlock x:Name="number" />
</TextBlock>

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi