WPF MVVM Warum sollten Sie ContentControl + DataTemplate-Ansichten anstelle von geraden XAML-Fensteransichten verwenden?

Ich habe eine Frage zu MVVM in WPF, die mich verrückt macht.

Warum so etwas machen :?

MainWindow.xaml:

<Window x:Class="MVVMProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>

Haben Sie Ihre ExampleView.xaml eingerichtet als:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    <DataTemplate DataType="{x:Type vms:ExampleVM}" >
        <Grid>
            <ActualContent/>
        </Grid>
    </DataTemplate>
</ResourceDictionary>

Und erstelle das Fenster so:

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();
    }
}

Wann kannst du es so machen :?

App.xaml: (Startfenster / Ansicht einstellen)

<Application x:Class="MVVMProject.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="ExampleView.xaml">
</Application>

ExampleView.xaml: (ein Fenster kein ResourceDictionary)

<Window x:Class="MVVMProject.ExampleView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    >
    <Window.DataContext>
        <vms:ExampleVM />
    </Window.DataContext>

    <Grid>
        <ActualContent/>
    </Grid>
</Window>

Im Wesentlichen ist es"Als DataTemplate anzeigen" (VaD) vs. "Als Fenster anzeigen" (VaW)

Hier ist mein Verständnis des Vergleichs: (Hinweis: Ich verwende VS 2008, daher fehlt mir die Mischbarkeit und / oder anderes Material.)

VaD: Hiermit können Sie die Ansicht wechseln, ohne das Fenster zu schließen. (Dies ist für mein Projekt nicht wünschenswert)VaD: VM weiß absolut nichts über die Ansicht, während sie in VaW (nur) in der Lage sein muss, sie beim Öffnen eines anderen Fensters zu instanziierenVaW: Ich kann meine XAML-Datei tatsächlich im Designer anzeigen (mit VaD ist dies nicht möglich, zumindest in meinem aktuellen Setup).VaW: Arbeitet intuitiv mit dem Öffnen und Schließen von Fenstern. Jedes Fenster hat (ist) eine entsprechende Ansicht (und ViewModel)VaD: ViewModel kann die anfängliche Fensterbreite, -höhe, -größe usw. über Eigenschaften weitergeben (während sie in VaW direkt im Fenster festgelegt werden).VaW: Kann FocusManager.FocusedElement setzen (nicht sicher, wie in VaD)VaW: Weniger Dateien, da meine Fenstertypen (z. B. Multifunktionsleiste, Dialogfeld) in ihren Ansichten enthalten sind

Also, was ist hier los? Kann ich meine Fenster nicht einfach in XAML erstellen, über die Eigenschaften der VM sauber auf ihre Daten zugreifen und damit fertig werden? Der Code-Behind ist derselbe (praktisch null). Ich habe Probleme zu verstehen, warum ich das gesamte View-Zeug in ein ResourceDictionary mischen sollte. (Aber ich will es nicht tunfalsch ;-))

Ist es überhaupt wichtig? Gibt es etwas, das ich verpasst habe? Vielen Dank fürs Lesen. :O

Vielen Dank an Rachel Lim und Nick Polyak für mein blühendes Verständnis von MVVM

Bearbeiten: Kleine Durchflussänderung

Antworten auf die Frage(3)

Ihre Antwort auf die Frage