2012-06-21 9 views
19

Qualcuno può spiegare come sono connessi View e ViewModel? Non riesco a trovare da nessuna parte xaml o xaml.cs per la vista che fa riferimento a ViewModel, né nulla nel file ViewModel.cs che fa riferimento alla vista, ma sono in qualche modo collegati e membri vincolanti dal ViewModel alla vista funzionano .In che modo una vista sa quale ViewModel usare in WPF?

Inoltre, nel costruttore di ciascuno, vi è solo InitializeComponent per la vista e un costruttore di base per ViewModel (nessuna dichiarazione/definizione della vista).

Grazie!

+0

Poiché non è chiaro se si stia utilizzando un framework MVVM di terze parti, sospetto che sarà necessario pubblicare del codice per ottenere una risposta accurata. Potresti * connettere la vista e il visore in una dozzina di modi diversi, e non possiamo vedere quale codice hai davanti a te. –

+0

Consiglierei di tornare alle origini - Ho scritto una serie su MVVM che copre davvero alcuni dei fondi, come "cos'è un modello di vista" e "qual è il punto di vista" e come si uniscono. Potrebbe valere la pena di scremare: http: // reedcopsey.com/series/windows-forms-to-mvvm/ –

risposta

27

Ci sono varie opzioni qui.

Qualcosa deve impostare il View DataContext come un'istanza di ViewModel. Ci sono molte opzioni qui:

  • Questo può essere fatto direttamente in xaml (la vista mostra solo il ViewModel direttamente).
  • Questo può essere fatto nel costruttore del View (this.DataContext = new MyViewModel();)
  • Questo può essere gestita attraverso una DataTemplate
  • A "coordinamento" classe può collegare questi insieme (es: una classe distinta "presentatore" può costruire sia Kit la DataContext opportunamente)

I più comuni sono di avere sia la vista definire il VM nel xaml (View-prima), o includere based da un punto ViewModel-centric di vista, e hanno WPF creare automaticamente la vista basata sulla VM vincolata (ViewModel-first).

Il primo approccio è quello che viene utilizzato da molti toolkit, come ad esempio MVVM Light. Quest'ultimo approccio è quello che ho usato nel mio MVVM blog series e utilizzato da alcuni altri toolkit.

+0

+1. Questa classe di "coordinamento" viene solitamente chiamata 'Controller' (pattern MVC) o' Presenter' (pattern MVP) in cui il presentatore agisce come controller e come modello di vista contemporaneamente. Andando verso MVP significherebbe che il 'ViewModel' aprirà la vista. –

+0

@ OlivierJacot-Descombes a meno che non si utilizzino modelli di dati, in questo modo la VM deve aprire le visualizzazioni. –

+0

@DannyVarod Se si utilizzano modelli di dati, WPF diventa effettivamente "Presentatore" nei termini MVP che lo coordinano per te. –

1

La vista contiene un oggetto della classe del modello di vista in xaml.

La funzione InitializeComponent crea tutti i controlli nella pagina, imposta gli stili, ecc

+0

Dove sarebbe? Non riesco a trovare alcun testo che contenga la parola "ViewModel" (Ecco come viene chiamato il mio modello di vista). –

+0

Si potrebbe voler guardare la risposta di Reed. Il modo in cui lo faccio è avere un oggetto del mio viewmodel nel View's xaml. – Justin

4

Un modo "pulito" per collegare i punti di vista alla vista modelli sarebbe ...

Quando si creano i punti di vista, per ogni visualizzazione, impostare la sua DataSource per la sua vista-modello:

Per esempio

public class App 
{ 
    private void OnAppStart() 
    { 
     var model = new MainModel(); 
     var vm = new MainVM(); 
     var view = new MainWindow(); 

     vm.Model = model; 
     view.DataSource = vm; 

     view.Show(); 
    } 
} 

Quando il modello si sta visualizzando le modifiche, aggiornare il VM:

public class MainVM 
{ 
    private void OnSelectedModelItemChanged() 
    { 
     this.SelectedItem = new ItemVM(); 
     this.SelectedItem.Model = this.SelectedModelItem; 
    } 
} 

e utilizzare i modelli di dati per rendere vista selezionare il punto di vista corretto di sub per ogni VM.

Problemi correlati