2011-02-03 9 views
19

Ho una visione che ha 2 viste sub su di esso e un ViewModel viene assegnato a ogni vista:WVF MVVM: in che modo ViewModels comunica tra loro?

ViewA - ViewModelA 
{ 
    ViewB - ViewModelB 
    ViewC - ViewModelC 
} 

viewB ha una casella di testo e viewC ha una combobox, entrambi i quali ho bisogno di accesso da ViewModelA. Non il controllo GUI stesso, ma il valore associato, cioè il testo della casella di testo e. Oggetto selezionato del componente ComboBox. Attualmente ho solo ViewModelB e ViewModelC come proprietà su ViewModelA ma sembra sbagliato.

Qual è il modo standard per i modelli di visualizzazione di comunicare tra loro senza interrompere il pattern MVVM? Sono completamente nuovo a WPF/MVVM.

+2

* ViewModelB ha una casella di testo e ViewModelC ha una casella combinata * ... Se devo prenderlo alla lettera, stai già rompendo il pattern MVVM. ViewModels non fa riferimento ai controlli WPF, espongono le proprietà che sono * vincolate * alle proprietà di dipendenza dei controlli * nelle viste *. Le macchine virtuali possono esporre le proprietà a vantaggio delle viste ad esse associate, ma devono rimanere ignoranti della natura (o dell'esistenza) di tali viste. –

+1

whoops volevo dire che ViewB ha una casella di testo e ViewC ha una casella combinata, io lo aggiusterò. – Dev1

risposta

11

Un modo per disconnettersi ViewModels comunica tra loro consiste nell'utilizzare un meccanismo di pubblicazione/sottoscrizione come PRISM s EventAggregator. Tuttavia, in una relazione ViewModel padre/figlio, penso che per il genitore sia corretto avere conoscenza e controllo diretti sul ViewModel secondario.

Personalmente, non penso che comporre un ViewModel con altri ViewModels sia una cattiva pratica. Lo faccio tutto il tempo. I generally favor composition over inheritance nel mio ViewModels.

+0

* Generalmente preferisco la composizione sull'ereditarietà nei miei ViewModels *: sono due cose diverse e una VM può utilizzare entrambe. – slugster

+0

@slugster - Sì, io li uso entrambi. Esempio: spesso inserisco molti problemi di infrastruttura in un ViewModel di base (INotifyPropertyChanged ecc ...). –

+0

@slug Direi l'ereditarietà per funzionalità e composizione per informazioni. – LuckyLikey

3

I ViewModels di solito "ereditano" le relazioni dal Modello. E non è sbagliato aggiungere una relazione quando ha senso.

È perfettamente OK per un ViewModel avere una proprietà che si riferisce a un altro ViewModel.

Problemi correlati