2009-05-23 5 views
6

Non riesco a capire come ottenere la notifica del modello di visualizzazione delle modifiche nel modello senza aggiungere un sacco di elementi specifici dell'interfaccia utente come INotifyProperyChanged e INotifyCollectionChanged nel mio modello o creare tonnellate di eventi diversi e fare un sacco di cose che si sentono come se fossero specifici dell'interfaccia utente e dovrebbero rimanere fuori dal modello.Come mantenere la logica di visualizzazione fuori dal modello e dalla logica aziendale dal modello di visualizzazione in MVVM?

Altrimenti dovrei solo duplicare tutte le logiche di business nel modello di visualizzazione per assicurarmi che tutto sia aggiornato, e quindi qual è il punto di avere il modello allora?

Uno dei più difficili che ho nel mio modello è una proprietà di una classe "Categoria". Si può pensare ad esso come una struttura ad albero e la proprietà è tutta discendente di nodi fogliari. Bene nel modello che la proprietà è generata al volo in modo ricorsivo attraverso tutti i suoi bambini, che è tutto bene e bene. Tuttavia, il modello della vista deve legarsi a quella proprietà e deve sapere quando cambia. Dovrei semplicemente cambiare il modello per ospitare il modello di visualizzazione? Se lo faccio allora il modello di vista non fa veramente nulla a questo punto, il modello solleva tutte le notifiche necessarie delle modifiche e la vista può semplicemente collegarsi direttamente al modello. Anche se la modella era qualcosa a cui non avevo la fonte, come potrei aggirare questo?

risposta

8

Non sono d'accordo che INotifyPropertyChanged e INotifyCollectionChanged sono specifici per l'interfaccia utente. Si trovano in spazi dei nomi e assembly che non sono collegati a nessun particolare stack UI. Per questo motivo, in genere metto quel tipo di comportamento il più basso possibile nel sistema (di solito il livello dati).

Se c'è qualche ragione per cui non vuoi metterlo a quel livello, va bene. Puoi metterlo a un livello più alto come il servizio o il livello dell'interfaccia utente. Tuttavia, è necessario assicurarsi che tutte le modifiche alle strutture di dati avvengano anche attraverso quel livello.

+0

Attualmente INotifyCollectionChanged è parte di System.Collections.Specialized che si trova in WindowsBase.dll. L'ho sempre trovato strano –

+0

Buon punto Cameron. Trovo che sia altrettanto confuso. Aggiungendo la mia risposta di conseguenza ... –

+0

Hmm, immagino che l'unica volta che ne ho mai sentito parlare è per le esercitazioni WPF per scopi di database, ma suppongo che non ci sia nulla di WPF inerente a loro che non sia usato per WPF. – Davy8