Laden...

MVVM: wie Kundennummer zwischen ViewModels übermitteln?

Erstellt von m74 vor 12 Jahren Letzter Beitrag vor 12 Jahren 793 Views
M
m74 Themenstarter:in
85 Beiträge seit 2009
vor 12 Jahren
MVVM: wie Kundennummer zwischen ViewModels übermitteln?

Hi,

ich hab einige Beiträge über Google gelesen und gestern auch hier im Forum.

Aber leider finde ich keine Antwort auf meine Frage, obwohl diese sicherlich eher mit dem Grundverständnis von MVVM zu tun haben wird.

Zunächst mal was ich überhaupt vorhabe:

  1. Ich habe ein CustomerModel (dies enthält die Kundenstammdaten), ein CustomerViewModel und eine View. Das ViewModel baut die View-Elemente dynamisch anhand des Models zusammen (somit ist im XAML nix weiter als ne ItemsControl).

  2. Daneben gibt es noch ein CallModel (dies enthält die Interaktionsdaten mit dem Kunden, z.B. ein Inbound oder Outbound-Call im CallCenter), ein CallViewModel und eine View. Hier wieder das selbe Prinzip mit dem dynamischen Aufbau.

  3. Dann habe ich noch ein SimCardModel (dies enthält die Handy-Karten des Kunden), auch hier wird wieder alles dynamisch erzeugt.

Somit soll der Anwender 1 KundenModel, 1 CallModel je Aufruf und [n] SimKartenModels angezeigt bekommen.

Die Einzelkomponenten funktionieren einwandfrei - nur wie verbinde ich das jetzt?

Ich muss ja die KundenID aus dem KundenModel irgendwie dem CallModel und den [n] SimKartenModels bekannt machen.

In XAML kann ich bei der Instanzierung eines DataContext-Objekts keine Parameter (in dem Fall die KundenID) übergeben. Im Code-Behind komme ich ebenfalls nicht (ohne gefrickel) daran, da ja alle Views eigene Controls mit jeweils eigenem ViewModel/Model sind.

Also dachte ich, ich verpacke das alles in eine Art "MainViewModel", aber sobald ich dies mache können sich die von den ViewModels dynamisch erzeugten Controls nicht mehr an die ganzen Parameter binden, obwohl ich in der MainViewModel diese als Properties herausgeführt habe.

Entweder ist nun mein Denkansatz völlig falsch oder ich beachte etwas beim Binding der Controls nicht richtig (wohl gemerkt: die einzelnen Views funktionieren wenn ich sie in einer MainView zusammen darstelle - nur da kann ich nicht untereinander kommunizieren).

Irgendwie mag ich das jetzt nicht im Code-Behind zusammenzufrickeln, dann wärs ja kein sauberes MVVM mehr 🤔

Hat jemand netterweise einen Tipp für mich?

Viele Grüße
m74

5.742 Beiträge seit 2007
vor 12 Jahren

In XAML kann ich bei der Instanzierung eines DataContext-Objekts keine Parameter (in dem Fall die KundenID) übergeben

Da liegt auch das Problem: Am besten erzeugst du deine ViewModels im Codebehind (bzw. eigentlich nur eins; das kannst du dann MainViewModel oder wie auch immer nennen).
Dann kannst du alle Controls via ContentPresenter und DataTemplates erzeugen und gut ist 😉

M
402 Beiträge seit 2005
vor 12 Jahren

Hi...

ich muss mich hier mal einklinken...

WinSharp93 du schreibst, ViewModel(s) im Codebehind erzeugen..."eigentlich nur eins".

Hierzu eine Frage, die auch für m74 interessant sein dürfte.

Eine Applikation, oder bei mir ein "Modul" kann ja mehrere Ansichten haben ( Grid, Detail, Edit,...) und diese werden teilweise als UserControls und teilweise als eigene Windows angezeigt.

Sollte man nun für das gesamte Modul ein ViewModel verwenden oder das auf mehrere ViewModels aufteilen (z.b. ViewModel für Grid, ViewModel für Detail, ViewModel für Edit).

Es haben die einzelnen "Views" ja auch unterschiedliche Funktionen und da kommt in einem ViewModel schon eine Menge an Commands zusammen...

5.742 Beiträge seit 2007
vor 12 Jahren

Sollte man nun für das gesamte Modul ein ViewModel verwenden oder das auf mehrere ViewModels aufteilen (z.b. ViewModel für Grid, ViewModel für Detail, ViewModel für Edit).

Ich würde die aufteilen (zumindest, wenn sie nicht exakt gleich sind) und dann Vererbung nutzen, um die Gemeinsamkeiten nur einmal formulieren zu müssen.

WinSharp93 du schreibst, ViewModel(s) im Codebehind erzeugen..."eigentlich nur eins".

Um das ein wenig zu präzisieren:
Ich würde nur das MainViewModel im Codebehind (der App.xaml.cs) erzeugen und die anderen ViewModels dann innerhalb dieses MainViewModels (bzw. per DI injizieren lassen).

Ich persönlich halte es meist sinnvoller, Controls anhand von ViewModels (per DataTemplate selbverständlich!) zu erzeugen und nicht jedes Control in XAML seinen DataContext spezifizieren zu lassen.

Letztere Vorgehensweise kann jedoch für sehr Webähnliche Anwendungen (also viel Navigation etc.) sinnvoll sein.
In diesem Fall würde ich dann aber auch gleich Magellan einsetzen.