Laden...

Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?

Erstellt von CC_Like vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.933 Views
C
CC_Like Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren
Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?

Hallo Leute,
ich bin dabei und versuche mich in MVVM einzuarbeiten.
Und schon stoße ich auf Probleme die ich auch im Forum oder in Beispielen nicht nachvollziehen kann.
Ich habe mehrere Views und möchte dieses je nach Auswahl im MainWindow in das MainWindow reinladen.

Ich habe folgende Ordner angelgt.

View
Ansicht1 (UserControl)
Ansicht2 (UserControl)
ViewModel
ViewModel1
Model
Model1

Soweit so gut.

Im MainWindow erzeugte ich ein ViewModel

ViewModel.ViewModel1 _Model = new ViewModel.ViewModel1();

Wie bekomme ich es jetzt hin, dass mein MainWindow.Content jetzt den View erhält?
Erzeugt man im MainWindow eine Instanz vom View?

MainWindow.Content = new View.Ansicht1()

Ist das noch konform mit dem MVVM-Pattern?

Vielen Dank und viele Grüße
Deto

G
180 Beiträge seit 2015
vor 4 Jahren

Hallo,

ich lerne zwar selbst noch, aber ich glaube ein paar Tipps kann ich dir geben:

1.

Ich habe folgende Ordner angelgt.

View
Ansicht1 (UserControl)
Ansicht2 (UserControl)
ViewModel
ViewModel1
Model
Model1

Da wird's schon mal sehr unübersichtlich. Als Ordner im Projekt-Explorer würde ich dir Models, Views und ViewModels vorschlagen. Außerdem möchte ich dir dringend raten auch für "Testprojekte" sinnvolle Namen für Ordner, Dateien und Variablen zu wählen, insbesondere, wenn du Hilfe brauchst. Denn für einen Außenstehenden ist nicht klar, welche Funktion ViewModel und ViewModel1 haben sollen. Worin unterscheiden sie sich?

  1. Im MainWindow solltest du gar keinen Verweis auf dein ViewModel setzen - das passiert besser im XAML-code. In deinem Fall:
  <Window.DataContext>
        <local:ViewModel1/>
    </Window.DataContext>

Leider bin ich mir nicht sicher, was du mit "anderer View je nach Auswahl" meinst - eine andere Ansicht (page), ein dynamisch erzeugtes UserControl (das entnehme ich jetzt mal aus Ansicht1 + 2)?

Dein UserControl bekommt ein eigenes ViewModel, z.B. Ansicht1ViewModel. In deinem Mainwindow, dort wo das UserControl erzeugt werden soll, musst du einen Verweis auf dein UserControl anlegen:

<StackPanel>
            
            <ItemsControl ItemsSource="{Binding Ansicht1ViewModel}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <local:Ansicht1/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

        </StackPanel>

Vielleicht hilft das ja schon.
Gruß
Vorph

5.657 Beiträge seit 2006
vor 4 Jahren

Was du suchst, sind DataTemplates. Damit kannst du je nach Typ deines ViewModel eine andere View anzeigen lassen. In [Artikel] MVVM und DataBinding im Abschnitt 5. Templates gibt es ein Beispiel.

UserControls braucht man in WPF meistens nicht, außer man hat ein Steuerelement, das man in anderen Projekten wiederverwenden möchte.

Weeks of programming can save you hours of planning

C
CC_Like Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Super, erstmal vielen Dank ich versuche die Tipps erstmal zu verstehen.
Danke

C
CC_Like Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Guten Morgen,
so ganz klar ist mir das Prinzip immernoch nicht.

Ich habe folgende Vorstellung von der Funktionsweise.

Ich habe ein Hauptfenster / MainWindow.
Beim Start des Programms stehen folgende Möglichkeiten zur Auswahl:

  1. Spiel starten
  2. Highscore ansehen

Hinter jeder Möglichkeit steht ein ViewModel

ViewModel.SpielStartenVM
ViewModel.HighscoreVM

Und hinter jeden ViewModel steht ein View.

View.SpielStartenView
View.HighscoreView

Wobei bei mir jeder View ein userControl ist.
Oder sollte man hier kein userControl verwenden?

Vielleicht kann mir ja jemand auf die Sprünge helfen.
Vielen Dank

4.931 Beiträge seit 2008
vor 4 Jahren

Im MainWindow erzeugte ich ein ViewModel

ViewModel.ViewModel1 _Model = new ViewModel.ViewModel1();  

Das alleinige Erzeugen des ViewModels reicht natürlich nicht, du mußt es der DataContext-Eigenschaft der View zuweisen, damit das Binding sich auf die im VM enthaltenen Eigenschaften anwenden läßt, s.a. [Artikel] MVVM und DataBinding ("2.2 Instanziierung des ViewModels").

Und schau dir mal die erste Antwort in WPF MVVM navigate views an, wie du per DataTemplate die VMs bzw. dahinterstehenden View wechseln kannst.

Ein anderer Ansatz ist in Navigating between views in WPF / MVVM beschrieben.

5.657 Beiträge seit 2006
vor 4 Jahren

Vielleicht kann mir ja jemand auf die Sprünge helfen.

Was du suchst, sind DataTemplates.

Weeks of programming can save you hours of planning