2009-10-14 19 views
6

Bene, penso di avere una buona conoscenza di MVVM. Ma ho bisogno di alcuni chiarimenti.MVVM, WPF e convalida

Il ViewModel è responsabile della chiamata al servizio appropriato per mantenere le informazioni del modello?

In tal caso, il ViewModel deve disporre di un metodo pulito per determinare se i dati in esso contenuti sono validi. Se i dati sono validi, aggiornerà il modello di conseguenza. Infine, viene invocato un servizio per la permanenza del modello, dato il modello appena aggiornato. Quindi la domanda è: come convalidare le informazioni del ViewModel e visualizzarle facilmente nella vista?

Ho visto alcuni approcci diversi alla convalida. Uno suggerisce di usare IDataErrorInfo che penso sia assolutamente disgustoso.

Un altro aggiunge ValidationRule a Binding.ValidationRules. Tuttavia, utilizzando questo approccio non è possibile operare nel contesto del modello nel suo complesso. L'oggetto ValidationRule può eseguire solo la convalida su un singolo valore. Un esempio potrebbe essere garantire che un valore sia un numero intero o all'interno di un determinato intervallo.

Un'altra idea che ho appena iniziato a esaminare è l'utilizzo di BindingGroup. Ma non ne so molto su questo a questo punto, perché sto ancora leggendo su di esso.

Mi piacerebbe essere in grado di eseguire la logica di validazione in un unico posto da utilizzare da View e ViewModel. Oltre a questo requisito, mi piacerebbe essere in grado di eseguire validazioni contro qualsiasi altro valore nel ViewModel. Inoltre, essere in grado di impedire a ViewModel di conservare i dati se si tratta di uno stato non valido. Questo dovrebbe essere facilmente riflesso nella vista.

Se qualcuno può indicarmi alcuni articoli o fornire qualche intuizione per il mio approccio desiderato sarei molto riconoscente.

+1

Per motivi di interesse, perché pensi che IDataErrorInfo sia disgustoso? –

+2

Penso che sia un cattivo uso dell'indicizzatore per iniziare. ViewModel ["Nome"] dovrebbe restituire un nome ... non null/"errore!". Sei anche limitato alle proprietà che hai associato alla vista. Non si presta bene a validatori come ValidateNameInformation dove può controllare tutti i campi coinvolti. Se sono frainteso in queste dichiarazioni, correggimi. – Joe

+2

Un modo per aggirare l'abuso dell'indicizzatore consiste nell'utilizzare un'implementazione esplicita dell'interfaccia. In questo modo non ho uno strano "indicizzatore" che sporca la mia interfaccia pubblica ViewModel. Sto ancora lavorando su come convalidare più campi usando MVVM. –

risposta

2

Facciamo la convalida dei nostri dati nel nostro modello di business e permettiamo il salvataggio solo quando il modello di business lo consente (perché ha dati validi), con il senno di poi avremmo potuto farlo nel modello della vista, ma questo significherebbe un diverso approccio di validazione per ogni modello di vista. e se si visualizzano due volte gli stessi dati in modi diversi, è possibile che si debba scrivere nuovamente la logica di convalida.

Facciamo isdirty e isValid su quasi tutti i campi nel livello aziendale, scriviamo il nostro oggetto campo personalizzato e un oggetto di riferimento estero personalizzato che implementa questo. quindi possiamo legare staraight a queste proprietà per vedere visivamente se siamo validi/sporchi ecc. Quindi proponiamo queste proprietà attraverso il modello di vista.

+2

Hai alcune librerie per aiutarti, ad es. Blocco dell'applicazione di convalida (http://msdn.microsoft.com/en-us/library/cc309509.aspx) e CSLA (http://www.lhotka.net/cslanet/) – armannvg