WPF MVVM Perché utilizzare le viste ContentControl + DataTemplate piuttosto che le viste dirette della finestra XAML?

Ho una domanda su MVVM in WPF che mi sta facendo impazzire.

Perché fare qualcosa del genere 😕

MainWindow.xaml:

     

Avere il tuo ExampleView.xaml impostato come:

        

E crea la finestra in questo modo:

     public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); MainWindow app = new MainWindow(); ExampleVM context = new ExampleVM(); app.DataContext = context; app.Show(); } } 

    Quando puoi farlo in questo modo 😕

    App.xaml: (Imposta finestra di avvio / Visualizza)

       

    ExampleView.xaml: (a Window not a ResourceDictionary)

      >        

    Essenzialmente è “Visualizza come DataTemplate” (VaD) contro “Visualizza come finestra” (VaW)

    Ecco la mia comprensione del confronto: (Nota, uso VS 2008 quindi mi manca Miscibilità e / o altre cose)

    • VaD: consente di modificare le viste senza chiudere la finestra. (Questo non è auspicabile per il mio progetto)
    • VaD: VM non sa assolutamente nulla della Vista, mentre in VaW (solo) deve essere in grado di istanziarlo quando apre un’altra finestra
    • VaW: posso effettivamente vedere il mio xaml reso in Designer (non posso farlo con VaD, almeno nella mia attuale configurazione)
    • VaW: funziona in modo intuitivo con windows di apertura e chiusura; ogni finestra ha (è) una corrispondente View (e ViewModel)
    • VaD: ViewModel può passare lungo la larghezza della finestra iniziale, l’altezza, la resizabilità ecc. Attraverso le proprietà (mentre in VaW sono impostate direttamente nella finestra)
    • VaW: può impostare FocusManager.FocusedElement (non so come in VaD)
    • VaW: meno file, poiché i miei tipi di windows (es. Ribbon, Dialog) sono incorporati nelle loro viste

    Allora, cosa sta succedendo qui? Non posso semplicemente build la mia finestra in XAML, accedere ai loro dati in modo pulito attraverso le proprietà della VM e farla finita? Il code-behind è lo stesso (praticamente nulla). Sto faticando a capire perché dovrei mescolare tutto il materiale View in un ResourceDictionary. (Ma non voglio sbagliarmi ;-))


    Ha importanza? C’è qualcosa che ho perso? Grazie mille per la lettura. : O


    Grazie a Rachel Lim e Nick Polyak per la mia comprensione capillare di MVVM

    Modifica: cambiamenti di stream minori