2010-04-19 9 views
6

Ho la seguente domanda riguardante MVVM light: cosa "guida" l'interfaccia utente? Vedo che posso avere un ViewModel per View che sto mostrando; ViewLocator gestisce tutti i ViewModels (per la memorizzazione nella cache come ho capito). Ma cosa sta guidando l'interfaccia utente?Ho bisogno di un controller di visualizzazione per MVVM-light in Silverlight?

Se ho un comando definito nel mio ViewModel che dice "ShowDetail"; devo scrivere il codice per visualizzare questa vista all'interno di ViewModel?

Ci sono esempi di questo? Grazie!

risposta

1

In MVVM, ciò che "guida" la vista è l'associazione dei dati. È possibile collegare la vista al ViewModel impostando DataContext della vista in modo che punti al modello di vista.

semplice esempio (usando MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase 
{ 
    (...) 
    private string _myProperty; 
    public string MyProperty { 
     get { return _myProperty; } 
     set { 
      _myProperty = value; 
      RaisePropertyChanged("MyProperty"); 
     } 
    } 
} 

MyView.xaml.cs

void MyView() { 
    DataContext = new MyViewModel(); 
} 

MyView.xaml

<TextBlock Text="{Binding MyProperty}" /> 
+1

Le mie domande erano più legate al caricamento di diverse visualizzazioni. Capisco il meccanismo di associazione con un ViewModel. Ma dove scrivo codice per mostrare una nuova vista quando l'utente esegue ad esempio il pulsante "Mostra dettagli"? –

5

Il MVVM il modello da solo non ha c'è qualcosa di specifico per la navigazione tra le viste. Sebbene, ci siano molte soluzioni per questo in diversi quadri. La soluzione più comune consiste nell'utilizzare una sorta di controller che "orchestra" la vista principale o utilizzare un approccio "Dettaglio principale" per le visualizzazioni secondarie.

Alcune soluzioni interessanti:

1

Ho creato un modello T4 tha t genera codice e mostra come navigare verso un uri o un oggetto, o chiudere una finestra (wpf). Funziona con luce MVVM

Download here

0

Penso che si potrebbe verificare Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

che sembra tranquilla promettente. Comunque penso che la maggior parte di questi quadri sia abbastanza difficile.

Ho implementato una soluzione con un semplice approccio MVVM con una sorta di modello di controller di supervisione che gestisce la comunicazione tra visualizzazioni e modelli di visualizzazione.

0

Si consiglia di consultare il sistema di messaggistica nel kit di strumenti MVVM light. Questo sembra essere l'approccio più semplice che ho trovato per realizzare questo.Ecco un esempio di come funziona:

Se avete 2 vista modelli - 1 per i clienti alla ricerca, l'altra per i dettagli di visualizzazione sul cliente selezionato:

In primo modello vista, si dispone di una proprietà come questo:

public string CustomerID 
    { 
     get 
     { 
      return _customerid; 
     } 

     set 
     { 
      if (_efolderid == value) 
      { 
       return; 
      } 

      var oldValue = _customerid; 
      _customerid = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged("CustomerID", oldValue, value, true); 
     } 
    } 

Poi, nel secondo modello vista, è registrarsi per ricevere i messaggi quando questo valore cambia dall'altro, come questa:

void registerForMessages() 
    { 
     Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
      (pcm) => 
      { 
       if (pcm.PropertyName == "CustomerID") 
       { 
        customerID = pcm.NewValue; 
        AddWorkplanCommand.RaiseCanExecuteChanged(); 
        loadCustomerDetails(); 
       } 
      }); 
    } 

Be sicuro di chiamare la funzione registerForMessages() nel costruttore del secondo modello di vista. Un'altra cosa che aiuta è creare una mappa di sorta quando hai 4 o più ViewModels nella tua applicazione. Trovo che sia facile crearne uno in un file di testo veloce nella soluzione per tenere traccia di tutti i messaggi e di ciò che sono destinati a realizzare, e quali altri modelli di vista sono registrati per riceverli.

Una delle cose veramente belle di questo è che si ha 1 viewmodel che invia una notifica di modifica, come la proprietà customerID modificata, e immediatamente 4 altri viewmodels ricevono tale modifica e tutti iniziano a caricare le modifiche da soli.