Wpf Commands in Menu

  • WPF

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

    Wpf Commands in Menu

    Hi,

    ich bin gerade dabei mich ein wenig mehr mit WPF zu beschäftigen und bin gerade bei den Commands.
    Grundsätzlich weiß ich wie ich Commands implementiere und diese über ein ViewModel binde.
    Ich mach es aktuell so das ich für jeden Command einen eigenen Command implementiere. Aber für ein Menu scheint mir das gar nicht so sinnvoll zu sein.
    Die meisten Menupunkte öffnen ein neues Fenster und ich würde gerne für alle an einen Command "OpenWindowCommand" binden, welcher ggf. über einen Commandparameter mit dem Namen zB ein anderes Window erzeugt (mit einem anderen ViewModel).

    Ist dies sinnvoll bzw wie ist diesbezüglich die best practice?
    Aktuell ist mein Ansatz für jeden Menupunkt ein eigener Command und im ViewModel übergebe ich dann einem WindowManagerService das ViewModel und anhand des ViewModels öffnet der WindowManager ein anderes View.
    Ich wollte möglichst MVVM konform bleiben so dass ViewModel nix von den Views weiß und auch möglichst kein CodeBehind existiert.
    Wäre es hier sinnvoller die neuen Windows im Codebehind der MainView zu öffnen?

    In einem Beispiel von hier dofactory.com/ über DesignPatterns verwenden die bei MVVM in .NET CodeBehind bei den Views um andere Views zu öffnen.
    Hat jemand ein paar Ansätze wie man das am besten umsetzt und halbwegs MVVM konform bleibt.
    Meine ViewModels haben keine Referenz auf Views und das möchte ich auch so belassen.

    Thx

    LG Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Achte darauf, dass du dir keinen abbrichst, bei angestrengten Versuchen, iwelche Pattern-Dogmen zu befriedigen.
    Ich zB bin nichtmal sicher, ob das MVVM-Dogma "kein View im Viewmodel" wirklich befriedigt ist, wenn man stattdessen einen "ViewmanagerService-Interface-Proxy-Fassade"-Objekt im Viewmodel hat, welches dann seinerseits nichts anderes tut, als über iwelche Umwege eben doch ein View zuzugreifen.

    Ich hab aber iwo mal das Stichwort "Messageing" aufgeschnappt, das waren glaub vergleichsweies brauchbare Strukturen, wie ein Viewmodel View-Aktionen herbeiführt. Also iwie son bischen was wie Databinding andersrum oderso.

    Ansonsten kann man ja vlt. auch sagen: Wenn der View ein anneren View öffnet, dann ist eben CodeBehind genau der richtige Ort für den entsprechenden Code.
    Hallo

    Irgendwie verstehe ich ja was @ErfinderDesRades meint. Man muss eben umwege gehen wenn man ds PAttern "befiedigen" will.

    Aber,
    wenn du MVVM Konform bleiben willst würde ich nicht über Messages gehen, das ist ein noch umständlicherer Weg wie meine Variante mit dem Service. (ErfinderDesRades weis was ich meine, aber weil er eben meine "Servicevariante" kennt frage ich mich warum er dir diese nicht empfielt.)
    Dieses ist wenigstens einfach du Handeln und ich muss nicht aufpassen das ich mir MemoryLeaks aufhalse weil ich mal ein Message vergesse zu deabonnieren.

    Mein Service ist eigenlich, da es DependencyInjection nutzt eine feine Sache und genau der Weg der eigendlich gegangen werden soll wenn man wirklich MVVM konform bleiben möchte.
    In dem Thread von Jeiss habe ich ein Beispiel hochgeladen und dort wurde auch schon viel drüber gesprochen. Wenn du fragen hast, kein Problem.
    Den Teil mit dem EntityFramework kannst du ja wegdenken.

    Das
    ist auf jeden Fall ein sauberes Beispiel, ob du unbedingt sooo sauberes MVVM machen willst bleibt dir überlassen, ich mache mittlerweile nichts mehr dazwischen, aber oft ist es wirklich so das es nicht benötigt wird.

    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. ##

    @Mono
    Hat dich die Antwort eigendlich befriedigt oder ist von deiner Seite aus noch was offen? Benötigst du ein Beispiel?

    Ich frage nur so blöd weil du ja "Forum-Affin" bist und der Thread nicht erledigt 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. ##

    Ja hatte nicht soviel Zeit mich damit im Moment wieder intensiver zu beschäftigen. Deine Variante erscheint mir aber auch genau wie der Erfinder erwähnt über Umwege doch auf die View zuzugreifen.
    Ich verwende aktuell Codebehind und habe so weiterhin keine Referenzen vom VM auf die View.
    (auch wenn dein Beispiel im ViewModel nur eine Referenz auf deinen Service hat. Dieser dann auf die Views.)

    Ich habe es noch offengelassen weil ich ggf. nochmal was posten werde.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    (auch wenn dein Beispiel im ViewModel nur eine Referenz auf deinen Service hat. Dieser dann auf die Views.)

    Falsch!!

    Das Stickwort ist Dependency Injection.

    Das Service ist ja in der VM-Assembly definiert.
    Das VM bleibt völlig sauber und hat keinerlei Referenz zum View. Genau wie es sich gehört. Willst du also "clean" bleiben und keine versehentlichen MemoryLeaks haben führt fast kein Weg vorbei.

    Grüße
    Sascha

    PS: Hast du es dir überhaupt angesehen weil du meinst das hier die View hereingereicht wird?
    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. ##