Hallo Forumgemeinde,
ich bin neu hier und beschäftige mich seit einiger Zeit mit WPF und MVVM. Meine ersten Demo-Projekte haben auch gut funktioniert. Wenn man das mit der Bindungen mal verstanden hat, finde ich das einer sehr saubere Lösung.
Jetzt habe ich mich an ein größeres Projekt getraut. Ich bin zu dem Entschluss gekommen, dass ich neben mehreren „Modellen“, auch immer eine dazugehöriges „ViewModel“ erstellen möchte. Ich habe mich dazu entschieden, da eine einzelne „ViewModel- Datei“ sehr groß werden könnte und da leidet für mich immer die Übersichtlichkeit darunter.
In manchen Forenbeiträge liest man, es sollte bei einem „View“, auch nur eine „ViewModel“ geben. In anderen Forenbeiträge liest man wiederum, das MVVM nur ein Vorschlag ist und man es eigentlich halten kann, wie man es selbst bevorzugt.
In dem neuen Projekt bin ich jetzt auf das Problem gestoßen, dass ich nicht weiß, wie man mehrere „ViewModele“ in einer „View“ verwendet.
Mein Projekt sieht exemplarisch so aus:
[Model]
- Person.cs
- Tier.cs
[ViewModel]
- ViewModelPerson.cs
- ViewModelTier.cs
[View]
- MainWindow.xaml
Weil ich zuerst mit der Implementierung der Person angefangen habe, sah meine .xaml Datei erst so aus:
xmlns:localVM="clr-namespace:MyProject_1.ViewModel"
und dann noch:
<Window.DataContext >
<localVM:ViewModelPerson/>
</Window.DataContext>
So haben die Bindings auch wunderbar geklappt. So wie es bei meinen ersten Demo-Projekten, mit nur einem „ViewModel“, auch immer war. Jetzt wollte ich mit der Implementierung von „Tier“ weiter machen. Aber jetzt stehe ich vor dem Problem, wie bekomme ich das „ViewModelTier“ in die .xaml Datei? Man kann ja nur einen DataContext vergeben?
Klar, die eine Lösung wäre, ich nutze nur ein „ViewModel“. Arrangieren könnte ich mich schon damit, aber dann würde zum einen bei noch größeren Projekten das „ViewModel“ sehr groß werden und zum anderen Löst es nicht mein fehlendes Verständnis dafür, wie man es mit mehreren „ViewModels“ lösen kann. Da fehlt mir einfach noch die Erfahrung wie man das zusammenbringt.
Kann mir hier im Forum jemand weiterhelfen?
Wie macht ihr es denn?
Ein „ViewModel“ für eine „View“, auch bei mehreren „Modellen“? Oder seid Ihr auch der Meinung, dass das Aufteilen auf mehrere „ViewModelle“ die Übersichtlichkeit besser wird?
Schönen Sonntag nach und viel Grüße.
Hallo und willkommen,
bei größeren Views benutzt man dazu eine hierarchische Implementierung(*), d.h. das Hauptviewmodel verwaltet dazu die Unterviewmodels (dies wird, in leichter Abwandlung, z.B. auch bei der Navigation zwischen verschiedenen Views genutzt), z.B.
public class MainViewModel : BaseViewModel
{
public PersonViewModel Person { get; private set; } = new PersonViewModel();
public TierViewModel Tier { get; private set; } = new TierViewModel();
}
So kannst du dann folgendes beim Binding benutzen:
<TextBox Text="{Binding Person.Name}" />
<TextBox Text="{Binding Tier.Name}" />
<!-- etc. -->
Oder du kannst auch einem ganzen Control dann ein Unterviewmodel als DataContext
geben:
<MyControl DataContext="{Binding Person}" Text="{Binding Name}">
<TextBox Text="{Binding Description}" />
</MyControl>
(*) s. z.B. (in englisch) Binding your View to your ViewModel in Wpf
PS: Die Erzeugung des ViewModels direkt im XAML-Code wird eigentlich nur bei kleinen Testprojekten aus Bequemlichkeit (bzw. zur Unterstützung im IDE-Designer) genutzt. Bei professionelleren Projekten sollte Dependency Injection (DI) benutzt werden (habe ich aus Einfachheit jetzt auch nicht im obigen MainViewModel
- mea culpa).
Hi Th69,
erst mal recht herzlichen Dank für Deine sehr schnelle und für mich gut erklärte Rückantwort. Ich habe es nachimplementiert und es hat auf Anhieb funktioniert. Alle Binding funktioniert wieder. Vielen Dank! Es ist tatsächlich ganz einfach und ich finde es so auch immer noch sehr logisch anzuwenden 😊
Danke auch für die zusätzliche Erklärungen und Links. Ich werde mir diese nochmal im Detail anschauen. „lostindetails“ kannte ich noch nicht.
Ich komme aus der C- Welt (µC) und C# erschlägt mich schon ein wenig. Trotz guter Lektüre und unzähligen Stunden im Netz. Das MVVM-Prinzip gefällt mir sehr gut. Das ist ähnlich wie in C, mit dem OSI-Schichtmodel. 😉
Genug abgeschweift... Danke nochmal für Deine Hilfe und einen schönen Sonntag noch 😊
Freut mich, daß ich dir (so einfach) helfen konnte. 😉
Dir auch noch einen schönen Sonntag!
Zitat von StayCalm
C- ... C#
--> im Endeffekt gibt C# mehr Leitplanken vor als C ( Stichwort "unsafe code" ). Den Code derart gestalten, dass (häufige(re)) Änderungen oder Erweiterungen (an zentraler Stelle) leicht(er) vorgenommen werden können, soll(te) man aber überall beachten.
Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉