2009-09-24 9 views
10

Stiamo costruendo un'app utilizzando lo schema MVVM, abbiamo controller che collegano tutte le viste e i modelli di visualizzazione usando DI. Tutti gli esempi di MVVM che ho visto sono davvero semplicistici e hanno 1 vista. Come/dovrebbero i modelli di vista rispondere al controller? Il controller conosce i modelli e le visualizzazioni, nel caso il viewmodel dovesse inviare eventi al controller? Dove dovrebbe accadere un salvataggio? Modello? Controllore?Controller in MVVM, Come ottenere informazioni da viewmodel al suo controller?

risposta

3

Utilizziamo anche controller, ma nel nostro caso sono responsabili del flusso di lavoro dell'applicazione. Il Controller conosce ViewModel e il Modello ma non la Vista concreta perché verrà iniettata dal Contenitore IoC.

Se siete interessati a un esempio che mostra più di una sola interfaccia utente (finestra di dialogo modale, procedura guidata con il flusso di lavoro subordinato) allora si potrebbe avere uno sguardo a:

WPF Application Framework (WAF) - http://waf.codeplex.com

+1

Ya stiamo facendo le cose al contrario. Il nostro controller conosce un'interfaccia vista e inietta il viewmodel e il modello. – nportelli

5

Il ViewModel potrebbe non essere dipendente da un IController o da un'altra interfaccia, in modo che possano rispondere ad esso? Cerco di mantenere il più possibile la logica applicativa del ViewModel, in quanto queste classi possono facilmente diventare gonfie.

MyViewModel(IController controller) 
{ 
    this.controller = controller; 
} 

void Save() 
{ 
    this.controller.Save(); 
} 

Sono d'accordo che i quadri MVVM tendono ad essere troppo semplicistica con i loro campioni. In particolare, spostarmi tra viste/schermate nella tua applicazione è qualcosa che mi piacerebbe vedere più esempi di. Creo un'interfaccia IViewManager, per consentire a ViewModels di richiedere che ci spostiamo su un'altra vista.

+1

Bene il controllore sa circa il ViewModel, non vogliamo una dipendenza 2 modo accadendo o la possibilità che un ViewModel il mio essere riutilizzato da un altro controllore. – nportelli

+1

Hmmmm, non sono del tutto sicuro di capire quale schema stai usando. Stai dicendo che hai un controller per visualizzazione? Non è più MVC che MVVM? Forse potresti aggiungere un po 'di codice di esempio alla tua domanda per mostrare come crei una vista e un modello di vista. –

+0

Un controller per visualizzazione no, un controller per caso d'uso. Scusa se non l'ho chiarito. – nportelli

1

Io uso una configurazione simile a voi. Nel mio controller, dove il mio DI e l'iniezione della vista si interrompono, a volte mantengo il riferimento al ViewModel (che mantiene la vista). Alcuni casi posso avere un evento sul VM che viene gestito dal controller. In altri casi estremi (come se la VM/V fosse stata creata al di fuori del controller, ad esempio in un'altra VM), potrei persino usare l'EventAggregator (con un forte riferimento) per ascoltare gli eventi che potrebbero essere attivati ​​sulla VM. In tal caso, non è necessario un riferimento memorizzato alla VM.

+0

Il nostro controller non conosce la VM. Semplicemente e interfaccia con la vista. La VM viene iniettata da lì. L'idea è che il controller non sia a conoscenza del modello implementato dall'interfaccia utente, quindi possiamo potenzialmente sostituire facilmente l'interfaccia utente. Penso che ciò porti ai nostri problemi. – nportelli

0

Come utilizzare gli eventi in cui il controllore si iscrive agli eventi VM o utilizzando un modello di mediatore in cui un mediatore viene iniettato in una VM.

Problemi correlati