myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- GUI: WPF und XAML (https://www.mycsharp.de/wbb2/board.php?boardid=85)
--- Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen? (https://www.mycsharp.de/wbb2/thread.php?threadid=122572)


Geschrieben von CC_Like am 25.01.2020 um 17:23:
  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

C#-Code:
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?

C#-Code:
MainWindow.Content = new View.Ansicht1()

Ist das noch konform mit dem MVVM-Pattern?

Vielen Dank und viele Grüße
Deto


Geschrieben von GeneVorph am 25.01.2020 um 17:51:
 
Hallo,

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

1.

Zitat:
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?

2. Im MainWindow solltest du gar keinen Verweis auf dein ViewModel setzen - das passiert besser im XAML-code. In deinem Fall:

XML-Code:
  <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:

XML-Code:
<StackPanel>

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

        </StackPanel>

Vielleicht hilft das ja schon.
Gruß
Vorph


Geschrieben von MrSparkle am 25.01.2020 um 17:54:
 
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.


Geschrieben von CC_Like am 25.01.2020 um 17:57:
 
Super, erstmal vielen Dank ich versuche die Tipps erstmal zu verstehen.
Danke


Geschrieben von CC_Like am 26.01.2020 um 07:25:
 
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


Geschrieben von Th69 am 26.01.2020 um 09:53:
 
Zitat von CC_Like:
Im MainWindow erzeugte ich ein ViewModel

C#-Code:
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.


Geschrieben von MrSparkle am 26.01.2020 um 15:39:
 
Zitat von CC_Like:
Vielleicht kann mir ja jemand auf die Sprünge helfen.

Zitat von MrSparkle:
Was du suchst, sind DataTemplates.


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 04.06.2020 19:35