Mehrere Views, ein ViewModel

  • WPF

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Mehrere Views, ein ViewModel

    Moin,

    ich versuche mich momentan etwas an WPF und bin auf eine Designfrage gestoßen.
    Ich habe eine View, die mehrfach instantiiert wird. Sprich man hat ein Fenster der View auf jedem Bildschirm (ja, das hat seinen Zweck).
    Nun gibt es im ViewModel Properties, die identisch für jede View sein sollen, allerdings auch welche, die View-spezifisch sein müssen.
    Genauer gibt es einen Labeltest, der überall identisch ist, allerdings muss ich wissen, auf welchem Monitor sich meine View befindet (sie ist nicht verschiebbar).

    Daher meine Frage, wie regel ich das mit den ViewModels? Ich komme ja nicht drum herum, pro View ein VM zu haben, wenn es View-individuelle Eigenschaften gibt, allerdings gefällt mir die Redundanz nicht, die ich bei den "statischen" Properties hätte.
    Ich will ja zentral eine Property setzen, und nicht den Wert mehrfach, obwohl er immer derselbe ist.

    Gibt es da einen Lösungsvvorschlag ?

    Vielen Dank,
    Plexian

    *Thema verschoben - Nach 1566 Beiträgen solltest du es wissen* ~NoFear23m
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo

    Du hast die Frage im Grunde selbst beantwortet.

    Du hast ein ViewModel - ich nenne es jetzt mal MasterViewModel. Dort sind die übergeordneten Properties drinnen welche sich beide Views Teilen sollen.

    In diesem ViewModel haste du zwei Propertie (oder wenn es X sein sollen eben eine Auflistung). Ich sage jetzt mal Public Property Slave1 As SlaveViewModel und Public Property Slave2 As SlaveViewModel.

    Fertig.
    Beide Fenster sind auch die eine Instanz von MasterViewModel gebunden. Wenn beide Fenster die selbe View enthalten, also ein und das selbe ViewModel musst du nun mit einem Flag (zb. als Dependency Property) diesem bekanntgeben auf welchen Slave dieses zugreifen soll. Klingt kompliziert, aber ist nicht so wild. Ich weis nur nicht ob diese zahl zwei eine Konstante ist.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Nein die Zahl ist nicht konstant, sie entspricht der Anzahl der angeschlossenen Bildschirme.
    Das heißt ich nutze die SlaveVMs als Properties in einem MasterVM, das klingt sehr gut, vielen Dank!
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Naja, wenn es keine Konstante ist brauchst du statt einelne Properties ala Slaves eben ein Property ala SlaveViewModels as List(Of SlaveViewModel)
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Na gut, dass ist klar.

    Mir kommt nun die Frage, wie genau du das die Entscheidung, welches SlaveVM gewählt wird, entschieden wird.
    Ich habe nun ja x Instanzen einer View (Window) und habe konkret einen Command für den ButtonClick, der auf den verschiedenen Viewinstanzen verschieden agiert (er ruft eine Methode mit anderen Parametern auf, je nachdem welcher Bildschirm verwendet wird).
    Nun kann ich ja a) nicht das Ganze im XAML binden, es sei denn ich hab alle Properties aus den SlaveVM nochmal im MasterVM, wobei dann im MasterVM das richtige SlaveVM gewählt wird. Dann bleibt aber die Frage, wie identifizierte ich das richtige SlaveVM, ich hab ja in einem Command bspw. keinen Rückschluss auf den Sender.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @ErfinderDesRades ich mir auch nicht 8o
    Wenn ich mir die Antwort von gestern so durchlese könnte ich mir auch nicht folgen. Sorry, was echt sehr dumm formuliert.

    Also du hast ein MasterViewModel in welchem ein Property vorhanden ist welches für "alle" verfügbar sein soll.
    Dann hast du eine Auflistung von SlaveViewModel(s). In SlaveViewModel gibt es ein ReadOnly Property z.b. ParentMasterVm. Und bem Instanziieren eines SlaveViewModel reicht du die Instanz des Masters über den Konstruktor hinein.

    Ist ein wenig verwirrend, ich häng dir mal ein MVVM Beispiel an welche das glaube ich ganz gut Demonstriert.

    Grüße
    Sascha
    Dateien
    • WindowDemo.zip

      (305,56 kB, 68 mal heruntergeladen, zuletzt: )
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @ErfinderDesRades Ich denke ich war an folgender Stelle unklar: Es geht nicht darum, dass die Instanzen an gemeinsame und verschiedene Properties gebunden werden (dann wäre Vererbung klar), sondern alle an das gleiche VM gebunden sind, aber ggf. die Properties verschiedene Werte pro View haben können (aber nicht immer!). Generell ist dafür ja static gedacht, aber das funktioniert logischerweise nicht mit dem INotifyPropertyChanged Interface.

    @Nofear23m Ich dachte ich hätte dich jetzt verstanden, aber dein Projekt wirft dann doch ein zwei Fragen auf.
    Meine Herangehensweise wäre nun, unter Voraussetzung, dass ich eine View-Klasse habe und ein SlaveVM sowie ein MasterVM.
    SlaveVM beinhaltet die Properties, dessen Werte pro Viewinstanz individuell ein können, MasterVM das Gegenteil. SlaveVM hat dabei eine Referenz auf MasterVM.
    Ich erstelle nun n Instanzen der View, n Instanzen eines SlaveVMs und eine Instanz des MasterVM. Jeder ViewInstanz gebe ich als DataContext ein SlaveVM und jedem SlaveVM geb ich als Referenz das MasterVM.
    Ich kann mir noch nicht ganz vorstellen, wie das Binding an eine Property aus MasterVM funktioniert, da der DataContext ja immer das SlaveVM ist, aber ich kann gerade auch nicht testen - solange die Idee richtig ist, probiere ich das nachher gern aus, vielen Dank bis hierhin!
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @Plexian

    Genau richtig. Das hast du vollkommen richtig beschrieben. Da man dann in der SlaveViewModel-Instanz ein Property vom Typ MasterViewModel hat hat die View per Binding auch zugriff auf die Instanz des MasterViewModels.
    Gucks dir an, ist nicht so kompliziert wie es erscheint.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m
    Alles klar, funktioniert alles so wie geplant, vielen Dank!
    Ich habe jetzt allerdings keine Referenz vom Master zu den Slaves, sondern nur andersherum, ich wüsste nicht wofür ich ersteres bräuchte.

    Thema als erledigt markiert!
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Plexian schrieb:

    Master zu den Slaves

    Natürlich hast du die. Im MasterViewModel sind doch die Slaves enthalten.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m
    Ne eben nicht :D

    Plexian schrieb:

    Meine Herangehensweise wäre nun, unter Voraussetzung, dass ich eine View-Klasse habe und ein SlaveVM sowie ein MasterVM.
    SlaveVM beinhaltet die Properties, dessen Werte pro Viewinstanz individuell ein können, MasterVM das Gegenteil. SlaveVM hat dabei eine Referenz auf MasterVM.
    Ich erstelle nun n Instanzen der View, n Instanzen eines SlaveVMs und eine Instanz des MasterVM. Jeder ViewInstanz gebe ich als DataContext ein SlaveVM und jedem SlaveVM geb ich als Referenz das MasterVM.

    So habe ich das Ganze umgesetzt, sprich nur eine Referenz von Slave zu Master, und der DataContext der Views werden die SlaveVM Instanzen.

    Funktioniert zumindest alles wie gewollt, gibt es da designtechnische Einwände?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Plexian schrieb:

    Funktioniert zumindest alles wie gewollt, gibt es da designtechnische Einwände?

    Ne, sehe ich keine.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##