Events und MVVM

  • WPF

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

    Events und MVVM

    Hallo,

    Ich brächte mal wieder ein wenig Hilfestellung zu MVVM:
    Gibt es eine Möglichkeit Routed Events in XAML zu verarbeiten bzw. auf handled=true zu setzen?

    Ich habe eine Listbox zu einer Zeichenoberfläche umgewandelt. ListBox deswegen, damit Items von Haus aus selektierbar sind.
    Jetzt komme leider ein wenig ins straucheln mit dem Bubbling-Event PreviewLeftMouseDown.

    Bei einem Linksklick sollen Dinge passieren wie zum Beispiel eine Linie von einem Listbox-Item zum einem anderen zu ziehen oder Listbox-Items mittels eines Thumbs zu verschieben. Preview-Linksklick ist aber ein Bubbling-Event welches den Viewtree weiter wandert und nach meinen festgelegten Aktionen dafür sorgt, dass immer das Listbox-Item unter der Maus selektiert wird, was aber nicht passieren soll.
    Das Tunneling-Event LeftMouseDown ist auch nicht brauchbar, da hierbei erst selektiert wird und dann, soweit überhaupt noch möglich, da ja das SelectedItem verändert wird, meine Aktionen ausgeführt werden.
    Aktuell habe ich es so gelöst, dass ich die EventArgs an das ViewModel mitschicke und diese dann im ViewModel auf handled=true setze mithilfe von weblogs.asp.net/alexeyzakharov…triggered-by-eventtrigger

    Spoiler anzeigen

    XML-Quellcode

    1. xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    2. <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
    3. <InvokeDelegateCommandAction Command="{Binding PreviewLeftClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=InvokeParameter}"/>
    4. </i:EventTrigger>

    VB.NET-Quellcode

    1. Public Property PreviewLeftClick As New RelayCommand(Of Object)(Sub(obj)
    2. Dim eventArgs = DirectCast(obj, MouseButtonEventArgs)
    3. ' do something
    4. eventArgs.Handled = True
    5. End Sub)



    Laut MVVM sollte man das nicht tun :) . Gibt es weitere Möglichkeiten mit der Behandlung von Routed-Events?

    Viele Grüße
    Hallo

    Sorry, liegt vieleicht an mir, aber ich habe mir den text nun 2x durchgelesen und verstehe nicht wirklich was genau du machen willst.

    Bitte beschreibe dein Problem wenn möglich anders oder mittels Beispielprojekt (ein kleines sauberes Projekt welches nur genau dieses Problem behandelt).
    Ich kann dir so nur leider nicht wirklich folgen.

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

    SKeks schrieb:

    Laut MVVM sollte man das nicht tun . Gibt es weitere Möglichkeiten mit der Behandlung von Routed-Events

    Es freut mich sehr das du versucht das Pattern zu "befriedigen". Sehr lobenswert. Wenn ich dich richtig verstehe machst du dir allerdings etwas zu viele sorgen.

    SKeks schrieb:

    Bei einem Linksklick sollen Dinge passieren wie zum Beispiel eine Linie von einem Listbox-Item zum einem anderen zu ziehen oder Listbox-Items mittels eines Thumbs zu verschieben.

    Alles was du UI betrifft kann im View bleiben.

    M-V-VM ist ein Pattern und beschreibt im groben ja einfach das die drei Schichten (Model - View - ViewModel) voneinander getrennt sein sollen da dies einige Vorteile in größeren Anwendungen bringt.
    Wenn ich dich also richtig verstehe willst du etwas bewerkstelligen was rein mit dem View zu tun hat. Also bleibt es auch im View. Wenn du eine Linie ziehen möchtest das hat diese Linie jetzt erstmal nichts mit dem VM zu tun.
    Ist also unabhängig von ViewModel.

    Beispiel: Ich habe im ViewModel zwei Listen mit einträgen. Ich View habe ich zwei Listboxen. Nun möchte mit zwei Button (-> und <-) die Eintäge von links nach recht und von rechts nach links schieben können. Also von der einen Listbox in die andere Listbox. Ich ätte zwei Commands im ViewModel welche mir das steuern. Also z.b. MoveSelectedItemFromAtoB_Command. ein Button welche auf den Command gebunden ist übernimmt mir das.
    Ich klicke auf den Button und der Eintrag wandert in die andere Liste und somit auch in die andere Listbox.
    Wunderbar, alles läuft über das VM. Was aber nun wenn ich das ganze per Drag&Drop machen will??

    Drag&Drop ist in dem Fall eine Sache welche sich rein im View abspielt. Die Funktion Drag&Drop ist abhängig davon das die View das überhaupt kann!!
    Also implementiere ich Drag&Drop im View und somit im CodeBehind der View. Im Drop Ereigniss spreche ich dann einfach den Command MoveSelectedItemFromAtoB_Command vom CodeBehind an und das VM schiebt es rüber.

    Bitte vergesse NIE das es nicht verboten(!) ist CodeBehind zu haben wenn es benötigt wird. Die Augabe selbst soll schon das VM übernehmen aber wie es dem User angezeigt wird, wie der User hier "geführt" wird und wie dies visualisiert wird überlässt du dem View.

    Ich hoffe ich habe dich richtig verstanden und konnte dir mit meiner (etwas blöd beschriebenen) Beschreibung weiterhelfen.
    Achja, EventArgs sollten demnach keine ins ViewModel. Das ist etwas wovon das VM nichts wissen muss.

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