it-swarm.it

Best practice sulle regole di associazione e convalida dei dati WPF

Ho un'applicazione WPF molto semplice in cui sto utilizzando l'associazione dati per consentire la modifica di alcuni oggetti CLR personalizzati. Ora voglio mettere un po 'di convalida dell'input quando l'utente fa clic su Salva. Tuttavia, tutti i libri WPF che ho letto non dedicano davvero spazio a questo problema. Vedo che puoi creare ValidationRules personalizzate, ma mi chiedo se questo sarebbe eccessivo per le mie esigenze.

Quindi la mia domanda è questa: esiste un buon esempio di applicazione o articolo da qualche parte che dimostra le migliori pratiche per la convalida dell'input dell'utente in WPF?

100
Mark Heath

Penso che il nuovo modo preferito potrebbe essere quello di utilizzare IDataErrorInfo

Maggiori informazioni qui

83
rudigrobler

Da MS documentazione Patterns & Practices :

Convalida dei dati e segnalazione degli errori

Il modello o il modello della vista saranno spesso richiesti 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à associate a un controllo, il modello o il modello della vista può segnalare un errore di convalida dei dati nel setter proprietà rifiutando un valore errato in entrata e generando un'eccezione. Se la proprietà ValidatesOnExceptions sull'associazione dati è vera, il motore dell'associazione dati in WPF e Silverlight gestirà l'eccezione e visualizzerà all'utente un segnale visivo di errore di convalida dei dati.

Tuttavia, se possibile, evitare eccezioni con proprietà in questo modo dovrebbe essere evitato. Un approccio alternativo consiste nell'implementare le interfacce IDataErrorInfo o INotifyDataErrorInfo sul modello di visualizzazione o sulle classi di modelli. 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 spiegando come implementare IDataErrorInfo e INotifyDataErrorInfo.

23
Pat

personalmente, sto usando le eccezioni per gestire la validazione. richiede i seguenti passaggi:

  1. nell'espressione di associazione dei dati, è necessario aggiungere "ValidatesOnException = True"
  2. nel tuo oggetto dati a cui stai vincolando, devi aggiungere il gestore DependencyPropertyChanged dove controlli se il nuovo valore soddisfa le tue condizioni - in caso contrario - ripristini il vecchio valore dell'oggetto (se necessario) e genera un'eccezione.
  3. nel modello di controllo utilizzato per visualizzare il valore non valido nel controllo, è possibile accedere alla raccolta errori e visualizzare il messaggio di eccezione.

il trucco qui, è di legare solo agli oggetti che derivano da DependencyObject. la semplice implementazione di INotifyPropertyChanged non funzionerebbe: nel framework è presente un bug che impedisce l'accesso alla raccolta degli errori.

10
Greg

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

3
murki

Potresti essere interessato all'applicazione BookLibrary dell'applicazione WPF Application Framework (WAF) = . Viene illustrato come utilizzare la convalida in WPF e come controllare il pulsante Salva in presenza di errori di convalida.

2
jbe

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

Se la business class è una classe stub creata da un riferimento a un servizio WCF/XmlWeb, non è possibile/non utilizzare IDataErrorInfo né generare l'eccezione da utilizzare con ExceptionValidationRule. Invece puoi:

  • Usa la ValidationRule personalizzata.
  • Definire una classe parziale nel progetto dell'interfaccia utente di WPF e implementare IDataErrorInfo.
0
Alex Pollan