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
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?
<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
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
Super, erstmal vielen Dank ich versuche die Tipps erstmal zu verstehen.
Danke
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:
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
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.
Vielleicht kann mir ja jemand auf die Sprünge helfen.
Was du suchst, sind DataTemplates.
Weeks of programming can save you hours of planning