Skip to content

Forum

Please or Register to create posts and topics.

Validazione di valori

Ciao

Domanda un po' generica: quali strategie usate per validare i dati che assegnate ad una property?

Come scritto in un altro post, sto usando EF6 per realizzare una applicazione WPF.

Visto che le classi modello vengono generate in automatico ma sono partial, inizialmente ho ripiegato sull'interfaccia IDataErrorInfo implementandola in un'altra classe partial.

Per implementare l'INotifyPropertyChanged Sabrina mi ha suggerito di bypassare completamente la classe originale (ho semplicemente commentato tutto il codice generato automaticamente) e riscriverla da zero per come serviva a me.

A questo punto pero' IDataErrorInfo è diventata meno indispensabile (a meno che uno non voglia gestirsi un ErrorTemplate).

Ora, con la nuova partial class potrei gestire la validazione sfruttando classi che ereditano da ValidationRule e quindi crearmi tutte le ValidationsRules necessarie per poi comunque dover gestire a livello XAML un ErrorTemplate.

Pero' le ValidationRules e IDataErrorInfo lavorano a livello di UI. Se percio' ad una property int assegno un valore string, la property non viene settata e di conseguenza non si scatena nemmeno l'evento che fa eseguire le validazioni di cui sopra.

E qui sta la domanda: dovendo comunque effettuare un controllo sul tipo di valore passato, non e' più efficace chiamare a livello di setter della property un metodo di validazione prima di assegnarle il value?

Voi come vi comportate?

 

EDIT

Facendo qualche prova ho notato che comunque passando un tipo non consentito, la UI solleva una eccezione System.Windows.Data Error prima ancora che che il value passi per il setter della property. Quindi dal setter non sembra possibile intercettare il valore non consentito.

sabrina_c has reacted to this post.
sabrina_c

Ciao,

Riguardo la validazione normalmente non mi capita di dover fare validazioni molto "ferree" per i miei utenti, mi limito a controllare la lunghezza dei dati e inoltre a segnalare i campi vuoti che sarebbe opportuno compilare, creare dei segnalini con immagine e tooltip è piuttosto semplice in WPF anche senza usare pattern particolari.

Però oltre a questo se hai delle necessità specifiche puoi usare gli attributi sui campi delle classi dati che ti permettono di creare delle UI che rispondono a questi attributi.

In ogni caso è sempre possibile agganciare i pulsanti di comando (Salva) ad una funzione di validazione in modo che non si attivino se non quando tutti i dati sono corretti.

Fai attenzione ad essere chiaro nelle spiegazioni quando blocchi l'utente perché le interfacce in cui i dati sono bloccati e non sai perché sono frustranti.

Inoltre, se fai dei controlli specifici, devi essere molto preciso altrimenti può succedere che sembri che il programma non funzioni.

Faccio un esempio: Codice fiscale errato blocca una interfaccia, ma chi ha fatto il controllo non ha tenuto conto dei codici fiscali degli stranieri che vengono sempre bollati come Errati.

I controlli di validazione sono sempre un arma a doppio taglio, che va quindi gestita bene.

saluti

 

Grazie dei consigli!

Per quanto possibile cerco sempre di ottenere dei risultati più professionali possibili e di rendere chiaro cosa un utente deve fare.

Nel mentre attendevo qualche commento, ho adottato questa soluzione semplice e rapida (non testata ancora al 100%).

WPF esegue già a livello di UI un validazione dei dati. Se in un campo int in binding con una TextBox viene inserito una valore stringa, in automatico il bordo del controllo diventa rosso.

Ho cercato quindi un modo per intercettare l'eccezione scatenata dalla UI e sfruttarla senza scrivere cose complicate.

Questo e' il risultato:

private myDatacontext dc;
public MyWindow()
{
InitializeComponent();
this.AddHandler(System.Windows.Controls.Validation.ErrorEvent, new RoutedEventHandler(OnValidationRaised));
this.DataContextChanged += Handler_DataContextChanged;
}

private void Handler_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)

{
dc = this.DataContext as MyDataContext;
}

private void OnValidationRaised(object sender, RoutedEventArgs e)
{
var args = (System.Windows.Controls.ValidationErrorEventArgs)e;
var os = args.OriginalSource;

if (args.Error.RuleInError is ExceptionValidationRule)
{
if (args.Action == ValidationErrorEventAction.Added)
{
((TextBox)os).ToolTip = "Invalid Value"; //Visualizzo il messaggio di errore nel ToolTip del controllo, in questo caso una TextBox
dc.CanSave = false;
}
else
{
((TextBox)os).ToolTip = null;
dc.CanSave = true;
}
}
}

 

Questo mi permette di validare il tipo di dato inserito.

Per la qualità del dato invece mi appoggio a IDataErrorInfo.

Se riesco postero' del codice per descriverne l'impiego.

 

sabrina_c has reacted to this post.
sabrina_c

Buona soluzione,

IDataErrorInfo credo di averlo usato in Windows Forms secoli orsono, ad ogni modo, per alcuni aspetti della validazione, ho utilizzato un immagine gestita da un converter, in modo da  evidenziare i punti ove vi fossero problemi utilizzando il binding ai dati.

La sola noia di questo tipo di soluzione è che devi generare un po' di property boolean (o enumerate se vuoi gestire casi diversi da vero e falso) dentro alla classe entity in binding sulla window o sullo user control.

Riguardo la validazione di numeri, date ecc. io preferisco usare controlli specializzati piuttosto che le textbox. quindi non ho questo tipo di problemi.

saluti