Warum das?
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>
Lassen Sie Ihre ExampleView.xaml wie folgt einrichten:
<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 erstellen Sie das Fenster wie folgt:
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 geht das so?
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 "View as DataTemplate" (VaD) vs. "View as Window" (VaW)
Hier ist mein Verständnis des Vergleichs:
- VaD: Ermöglicht das Wechseln der Ansicht, 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 instanziieren
- VaW: Ich kann meine xaml tatsächlich im Designer sehen (ich kann nicht mit VaD, zumindest in meinem aktuellen Setup).
- VaW: Funktioniert intuitiv beim Öffnen und Schließen von Fenstern. Jedes Fenster hat (ist) eine entsprechende Ansicht (und ViewModel)
- VaD: ViewModel kann die anfängliche Fensterbreite, -höhe, -anpassbarkeit usw. über Eigenschaften weitergeben (während sie in VaW direkt im Fenster festgelegt werden).
- VaW: Kann FocusManager.FocusedElement einstellen (nicht sicher, wie in VaD)
- VaW: Weniger Dateien, da meine Fenstertypen (z. B. Multifunktionsleiste, Dialogfeld) in ihre Ansichten integriert 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 sein? Der Code-Behind ist der gleiche (praktisch Null).
Ich habe Probleme zu verstehen, warum ich das gesamte View-Material in ein ResourceDictionary mischen sollte.