Ich entwickle eine WPF-Anwendung mit dem MVVM-Muster, RelayCommand usw. Ich lese viel zu dieser Frage, aber ich bin mir nicht sicher:
Ich möchte lediglich eine Form wie eine Ellipse verschieben und ihre endgültige Position erfassen, um sie in die Datenbank einzufügen.
Aber ich kann Ereignisse (MouseLetButtonDown, MouseLeftButtonUp und MouseMove) nicht an Befehle binden. Ich habe über angehängtes Verhalten gelesen, aber ich brauche die Argumente der Ereignisse (MouseButtonEventArgs und MouseEventArgs), um die Position abzurufen.
Lösung?
Beim Schreiben einer grafischen MVVM-Anwendung ist es verlockend zu versuchen, alle benötigten Ereignisse an das Ansichtsmodell zu senden. Die Verarbeitung sichtarischer Mausereignisargumente in einem Befehl steht jedoch im Gegensatz zu den MVVM-Prinzipien und dem Ziel der losen Kopplung.
Der Weg zur Lösung dieses Problems besteht darin, die Operation zu einer Aufgabe zu abstrahieren, die die Sicht ausführen kann, und dann ihre Ergebnisse über Operationen und Daten an das Sichtmodell zurückzuleiten. Wenn Sie eine kleine Menge Code im Code-Behind ausführen möchten, um dies zu unterstützen, wird die MVVM-Polizei nicht kommen und Ihre Kinder mitnehmen. Ein noch besserer Weg besteht darin, Interaktivität mit Verhaltensweisen zu ergänzen. Verhalten sind wiederverwendbare Funktionen ohne Code-Behind, die gut mit dem MVVM-Muster und Anwendungen funktionieren, die Interaktivität benötigen, die andernfalls das Hinzufügen von Ereignishandlern zu Ihrem XAML erfordern würde.
Siehe meine Antwort hier für ein vollständiges Beispiel eines Verhaltens, das Mausereignisse zum Ziehen grafischer Objekte verwendet:
Wenn Ihre Interaktivität von der Ansicht ausgeführt wird, kann sich das Ansichtsmodell an Daten und Befehle halten.
Sie finden XCommand Open-Source-Codeplex-WPF-Erweiterungsprojekt hier, xcommand.codeplex.com , dies ermöglicht Sie binden Command und CommandParameter von beliebigen Ereignissen wie MouseMove, MouseLeftButtonDown an alle UI-Elemente, die von WPF UIElement erben.
Hier finden Sie die Windows Store 8-Anwendung und die Windows-Desktop-Anwendungsversion von Klassenbibliotheken. Sie möchten WPFXCommand, das sich mit der WPF-Desktopanwendung befasst. Hier, wie es funktioniert. Fügen Sie WPFXCommand.dll als Referenz zu Ihrem Wunschprojekt hinzu.
Fügen Sie den Namespace in Ihrer XAML-Datei wie folgt hinzu:
%Vor%Jetzt können Sie Befehl und CommandParameter an alle verfügbaren Ereignisse auf allen UI-Elementen binden, die von WPF übernommen werden UIElement wie folgt:
%Vor%Ich hoffe, dies wird Ihnen helfen, den ereignisbasierten Code loszuwerden.