Best practice per le regole di convalida e convalida dei dati WPF

Ho un’applicazione WPF molto semplice in cui sto usando l’associazione dati per consentire la modifica di alcuni oggetti CLR personalizzati. Ora desidero inserire la convalida dell’input quando l’utente fa clic su save. Tuttavia, tutti i libri del WPF che ho letto non dedicano veramente spazio a questo problema. Vedo che è ansible creare ValidationRules personalizzate, ma mi chiedo se questo sarebbe eccessivo per le mie esigenze.

Quindi la mia domanda è questa: c’è qualche buona applicazione di esempio o articolo da qualche parte che dimostra le migliori pratiche per la validazione dell’input dell’utente in WPF?

Penso che il nuovo modo preferito potrebbe essere utilizzare IDataErrorInfo

Leggi di più qui

Dalla documentazione di MS’s Patterns and Practices :

Convalida dei dati e segnalazione degli errori

Il modello o il modello di visualizzazione sarà spesso richiesto per eseguire la convalida dei dati e segnalare eventuali errori di convalida dei dati alla vista in modo che l’utente possa agire per correggerli.

Silverlight e WPF forniscono supporto per la gestione degli errori di convalida dei dati che si verificano quando si modificano le singole proprietà associate ai controlli nella vista. Per le singole proprietà legate ai dati a un controllo, il modello o il modello di visualizzazione può segnalare un errore di convalida dei dati all’interno del setter di proprietà rifiutando un valore errato in arrivo e generando un’eccezione. Se la proprietà ValidatesOnExceptions sull’associazione dati è vera, il motore di associazione dati in WPF e Silverlight gestirà l’eccezione e visualizzerà un segnale visivo all’utente che è presente un errore di convalida dei dati.

Tuttavia, si dovrebbero evitare le eccezioni di lancio con proprietà in questo modo, laddove ansible. Un approccio alternativo consiste nell’implementare le interfacce IDataErrorInfo o INotifyDataErrorInfo sul modello di visualizzazione o sulle classi del modello. Queste interfacce consentono al modello o al modello di visualizzazione di eseguire la convalida dei dati per uno o più valori di proprietà e di restituire un messaggio di errore alla vista in modo che l’utente possa essere informato dell’errore.

La documentazione continua a spiegare come implementare IDataErrorInfo e INotifyDataErrorInfo.

personaly, sto usando le eccezioni per gestire la convalida. richiede i seguenti passaggi:

  1. nell’espressione di associazione dei dati, è necessario aggiungere “ValidatesOnException = True”
  2. nell’object dati a cui si sta vincolando, è necessario aggiungere il gestore DependencyPropertyChanged in cui si controlla se il nuovo valore soddisfa le condizioni; in caso contrario, si ripristina il valore vecchio object (se necessario) e si genera un’eccezione.
  3. nel modello di controllo che si utilizza per visualizzare un valore non valido nel controllo, è ansible accedere alla raccolta degli errori e visualizzare il messaggio di eccezione.

il trucco qui, è di bind solo agli oggetti che derivano da DependencyObject. la semplice implementazione di INotifyPropertyChanged non funzionerebbe – c’è un bug nel framework, che ti impedisce di accedere alla raccolta degli errori.

Controlla anche questo articolo . Presumibilmente Microsoft ha rilasciato la sua Enterprise Library (v4.0) dai loro schemi e pratiche in cui coprono l’argomento di convalida ma dio sa perché non hanno incluso la convalida per WPF, quindi il post del blog a cui ti sto dirigendo, spiega che cosa l’autore ha fatto per adattarlo. Spero che questo ti aiuti!

Potresti essere interessato all’applicazione di esempio BookLibrary di WPF Application Framework (WAF) . Mostra come utilizzare la convalida in WPF e come controllare il pulsante Salva quando esistono errori di convalida.

Se la tua class business viene utilizzata direttamente dall’interfaccia utente, è preferibile utilizzare IDataErrorInfo perché avvicina la logica al proprietario.

Se la class aziendale è una class stub creata da un riferimento a un servizio WCF / XmlWeb, non è ansible / non utilizzare IDataErrorInfo né eseguire Eccezione da utilizzare con ExceptionValidationRule. Invece puoi:

  • Utilizza ValidationRule personalizzato.
  • Definire una class parziale nel progetto dell’interfaccia utente WPF e implementare IDataErrorInfo.