WinForms+MVVM: Wie könnte ein Control-Event einen ViewModel-RelayCommand auslösen?

  • VB.NET
  • .NET 7–8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    WinForms+MVVM: Wie könnte ein Control-Event einen ViewModel-RelayCommand auslösen?

    Hallo zusammen.

    Die noch anfängliche Kombiarbeit aus .NET, WinForms und MVVM fällt mir immer noch schwer.
    Ich habe inzwischen mein DGV-Ersatz namens DataListPanel (DLP) soweit ausgebaut, dass es alle für mich relevanten Eigenschaften besitzt:
    • Hosten von inhaltlich beliebigen UserControls; allerdings kann pro DLP nur ein UserControl-Typ angegeben werden - wenn alle Zeilen unterschiedlich aussehen würden, würde ja keiner mehr durchblicken
    • Vorselektionsanzeige per MouseOver
    • Selektion einer Zeile per Mausklick
    • Festlegung einer Durchsuchspalte, s. nächster Punkt; alternativ Durchsuchung aller Spalten
    • Durchsuchen der festgelegten Spalte oder aller Spalten nach Text; tippt man also Foo, wird der nächstpassende entsprechende Eintrag ausgewählt und ggf. dorthin gescrollt.
    Nun ist es aber so, dass ich bei Texteingabe zwar den nächstbesten Eintrag selektiert bekomme, ich würde dann aber gerne gleichzeitig eine Aktion auslösen. Klar, ich kann vom DLP aus ein Event feuern. Aber wie mache ich es, damit es MVVM-gemäß bleibt? In WinForms kann ich derzeit ja nur bei z.B. einem Button mit dessen Command-Property eine Aktion mittels RelayCommand hervorrufen. Bei dem Versuch, eine eigene, funktionierende Command-Property zu erzeugen, bin ich nicht weitergekommen.
    Bilder
    • DataListPanel.png

      41,13 kB, 437×480, 19 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    musste mal EventToCommand googeln. Ich hab das nie verwendet, weil mir zu umständlich, da für jedes Event ein EventToCommand-Gehampel einzurichten, und hängt man noch mehr am Nuget-Tropf.
    Bislang, wenn ich Events von Wpf-Controls haben will, hole ich mir per Binding das ganze Control ins Viewmodel.
    Die Frage ist oft:
    Brauchst du tatsaechlich Commands, oder bindest du Eigenschaften.

    Vorselektion, Selektion, Durchsuchen - das klingt alles mehr nach Eigenschaften-Binding (koennte sich mit mehr Kontext natuerlich aendern).
    Nur das Ausloesen von einer konkreten Aktion anschliessend wuerde meines Erachtens dann den eigentlichen Command erfordern.

    Und ja, das Klicken eines Eintrages, _um_ ihn zu selektieren, hat schon Command Charakter. Aber es ist streng genommen dann die "SelektierterKunde" Eigenschaft, die sich im ViewModel geaendert hat, und dementsprechend andere Eigenschaftenaenderungen (oder auch Fire-And-Forgets) nach sich zieht.

    ErfinderDesRades schrieb:

    hole ich mir per Binding das ganze Control ins Viewmodel.
    Heisst das, du hast eine Abhaengingkeit zum UI-Stack (WPF in diesem Fall?) in deinem ViewModel?Das wuerde ich persoenlich naemlich fuer den falschen Ansatz halten. Das ViewModel sollte meiner Meinung nach keine Abhaengigkeiten zum UI-Stack haben, damit es wiederverwendbar und unit-testbar bleibt.

    Gruss

    Klaus

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

    loeffel schrieb:

    Nur das Ausloesen von einer konkreten Aktion anschliessend wuerde meines Erachtens dann den eigentlichen Command erfordern.
    Und da fehlt mir der Gedankengang, wie ich das umsetze. Ich freue mich über Tipps.

    Aber:
    Es ist schön und facepalming zugleich, wenn ich erneut mitbekomme, dass ich schon alles habe, danke für den Hinweis/Denkanstoß, @loeffel. Das MainViewModel hat nämlich bereits das selektierte Einzelviewmodel als Property, um auch außerhalb des Controls Aktionen für die selektierte Zelle / das selektierte UserControl (UC) und damit das selektierte ViewModel (DataContext des UCs) zu ermöglichen. Bisher war es eine einfache Property, aber wenn ich es zu einer vollqualifizierten mache, kann ich genau die Aktion im MainViewModel auslösen, die ich wollte. Also ist hier gar kein Event vom Control nötig, solange ich mit MVVM arbeite. Für Classic WinForms werde ich es aber erstmal drinbehalten, solange ich noch in meiner Projekttransformationsphase bin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    loeffel schrieb:


    ErfinderDesRades schrieb:

    hole ich mir per Binding das ganze Control ins Viewmodel.
    Heisst das, du hast eine Abhaengingkeit zum UI-Stack (WPF in diesem Fall?) in deinem ViewModel?Das wuerde ich persoenlich naemlich fuer den falschen Ansatz halten. Das ViewModel sollte meiner Meinung nach keine Abhaengigkeiten zum UI-Stack haben, damit es wiederverwendbar und unit-testbar bleibt.
    Jo, das heisste es, ganz unverfroren.

    Viewmodelse habich bislang noch nie wiederverwendet, und solche, denen ich mit diesem 'Hack' kommen muss, sowieso nicht.
    Ich teste auch nur, wenn Code wirklich knifflig ist, und bei diesen 'gehackten' VMs muss ich dann wohl auch drauf verzichten.