myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
CC_Like
myCSharp.de-Mitglied

Dabei seit: 06.12.2019
Beiträge: 3


CC_Like ist offline

Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
25.01.2020 17:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 118
Entwicklungsumgebung: Visual Studio 2013


GeneVorph ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
25.01.2020 17:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.383
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
25.01.2020 17:54 Beiträge des Benutzers | zu Buddylist hinzufügen
CC_Like
myCSharp.de-Mitglied

Dabei seit: 06.12.2019
Beiträge: 3

Themenstarter Thema begonnen von CC_Like

CC_Like ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Super, erstmal vielen Dank ich versuche die Tipps erstmal zu verstehen.
Danke
25.01.2020 17:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
CC_Like
myCSharp.de-Mitglied

Dabei seit: 06.12.2019
Beiträge: 3

Themenstarter Thema begonnen von CC_Like

CC_Like ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
26.01.2020 07:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.593
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am 26.01.2020 10:08.

26.01.2020 09:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.383
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CC_Like:
Vielleicht kann mir ja jemand auf die Sprünge helfen.

Zitat von MrSparkle:
Was du suchst, sind DataTemplates.
26.01.2020 15:39 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


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