2010-09-20 13 views
6

Ciao compagni StackOverflow utenti (o Stackoverflowers?):WPF MVVM Dubbi

sto imparando-by-codifica WPF. Ho letto diversi articoli/visto diversi screencast, e provenendo da uno sfondo di dev del WEB, ho attivato VS2010 e ho iniziato a fare un'applicazione di esempio che mi avrebbe aiutato ad imparare le basi.

Ho letto anche su MVVM e ho iniziato a usarlo. Ho impostato la mia soluzione per utilizzare WPF 4.0, ActiveRecord 2.1 e SQLite e tutto è andato bene. Ma ho ancora qualche dubbio:

  • ho creato un MainWindowViewModel, e sto usando la classe RelayCommand da here al ... trasmettere il comando. Sto rompendo qualsiasi linea guida avendo un MenuItem dalla MainWindow per avere il suo comando legato a una proprietà di questo viewmodel?

  • Questa azione mi sta legando al comando MenuItem per creare un'istanza di un nuovo ViewModel e una nuova vista e mostrarla. Di nuovo, è ok nel contesto MVVM?

  • La mia MainWindow sarà una sorta di "dashboard" e avrò più di un modello allegato a questa dashboard. Dovrei semplicemente avvolgere tutti quei modelli in un modello a vista singola?

Qualcosa di simile a questo:

public class MainWindowViewModel { 

    private ObservableCollection<Order> openOrders; 
    private Address deliveryAddress; 
    private Order newOrder; 
    /* Wrappers for the OpenOrders Collection */ 
    /* Wrappers for Delivery Address */ 
    /* Wrappers for New Order */ 
    /* Command Bindings */ 

} 

TIA!

+0

Alcune persone si riferiscono agli utenti StackOverflow come impilatori –

+0

@Eduardo, wtaniguchi: vedere [questa discussione] (http://meta.stackexchange.com/questions/6254/what-should-the-users-of-stack- overflow-be-called) su meta –

risposta

6

Ho creato un MainWindowViewModel e sto utilizzando la classe RelayCommand da qui per ... inoltrare il comando. Sto rompendo qualsiasi linea guida avendo un MenuItem dalla MainWindow per avere il suo comando legato a una proprietà di questo viewmodel?

No, non stai infrangendo alcuna linea guida. E 'perfettamente adeguata per associare il MenuItem a un comando della MainWindowViewModel (dove altro si dovrebbe mettere questo comando in ogni caso?)

L'operazione Sto vincolante il comando MenuItem per sta per istanziare un nuovo ViewModel e una nuova Visualizza e mostralo. Di nuovo, è ok nel contesto MVVM?

È perfettamente necessario creare un nuovo ViewModel, ovviamente. Per quanto riguarda la creazione di una nuova vista, dipende da come la crei ... dovresti ovviamente mai istanziare una vista esplicitamente dal ViewModel, perché introdurrebbe una dipendenza della VM alla vista.

La mia MainWindow sarà una sorta di "dashboard" e avrò più di un modello allegato a questa dashboard. Dovrei semplicemente avvolgere tutti quei modelli in un modello a vista singola?

Dipende da cosa si intende per "avvolgere" ... Il tuo MainWindowViewModel potrebbe esporre altre ViewModels attraverso le proprietà, e tesi VM verrà visualizzato in diverse parti della vista. Se è questo che intendi, sì, dovresti avvolgerli.

+0

grazie per la vostra risposta. Per la seconda risposta, stavo pensando perfettamente a ciò quando ho posto la domanda. Supponendo che non chiamerei esplicitamente "new SomeView();", come dovrei chiamare un'altra vista all'interno di un viewmodel? Riguardo la terza risposta, avrei bisogno di esporre i ViewModels di cui avrei bisogno per le diverse parti della vista e usare un UserControl + a ResourceDictionary per eseguire il rendering di quel tipo e associare la VM esposta ad esso? – wtaniguchi

+0

Per il secondo punto, in genere utilizzo un ContentControl che seleziona il DataTemplate appropriato in base al tipo di viewmodel. Per il 3 °: sì, esattamente –

+0

Ok! Grazie! Penso di avere una migliore comprensione ora, e lavorerò sui miei pensieri attorno a questi problemi! – wtaniguchi

3

Aggiunta alla risposta Thomas:

avrei creare diverse usercontrols per ogni parte del cruscotto e assegnare un ViewModel a ciascun usercontrol.

2

Ho creato un MainWindowViewModel e sto utilizzando la classe RelayCommand da qui per ... inoltrare il comando. Sto rompendo qualsiasi linea guida avendo un MenuItem dalla MainWindow per avere il suo comando legato a una proprietà di questo viewmodel?

No, è esattamente dove si inseriscono i comandi.

L'operazione Sto vincolante il comando MenuItem per sta per istanziare un nuovo ViewModel e una nuova vista, e mostrarlo. Di nuovo, è ok nel contesto MVVM?

Non dovrebbe essere necessario sapere come creare un'istanza di una nuova vista; questo è il lavoro della vista. Le specifiche su come farlo dipendono da come stai mostrando questa nuova vista: potrebbe essere semplice come avere un ContentPresenter nella vista associata a una proprietà nel modello di vista, quindi quando si imposta la proprietà (e si aumenta PropertyChanged) ContentPresenter esegue il rendering del nuovo oggetto con il relativo DataTemplate.

Le cose si fanno un po 'male se con "istanziare una nuova vista" si intende "aprire una nuova finestra". Non c'è un modo particolarmente elegante per farlo, specialmente se vuoi che la nuova finestra sia una finestra di dialogo modale. Un modo è quello di aggiungere un gestore di eventi al code-behind della vista che ascolta PropertyChanged sul modello di vista; quando viene impostata la proprietà del modello di vista subordinato, il codice nella vista crea e mostra la nuova finestra.

La mia MainWindow sarà una sorta di "dashboard" e avrò più di un modello allegato a questa dashboard. Dovrei semplicemente avvolgere tutti quei modelli in un modello a vista singola?

Sicuro. Questo è un modello molto comune. Non è affatto raro, ad esempio, esporre una proprietà di una collezione osservabile e legare un ItemsControl di qualche tipo ad esso; la vista creerà automaticamente viste per ogni modello di vista inserito in quella raccolta. Ancora una volta, l'implementazione specifica dipende molto dalla tua applicazione.