WPF: Wie befestigen Sie die Maus-Ereignisse an ein viewmodel?
Ich bin versucht, das MVVM-pattern für die erste Zeit. Also ich habe einen ItemsControl
gefüllt mit meinem viewmodel-Objekte angezeigt, die DataTemplate
's; die Objekte sind "Knoten" und "Kanten" dargestellt DataTemplate
's mit Thumb
und Polyline
Objekte und ich möchte in der Lage sein, zu erkennen, klicken und ziehen auf der ItemsControl
damit sich der Knoten und Kanten.
Zwei Fragen:
- Wie befestige ich die Maus-event-Handler, um die
Polyline
's undThumb
's behandelt werden, die durch das kleine viewmodels? (Ich könnte anfügen einerThumb.DragDelta
handler zuItemsControl
unde.OriginalSource
Punkte derThumb
, aber wie bekomme ich das entsprechende viewmodel-Objekt?) - Wie befestige ich die Maus-event-Handler, um die
ItemsControl
zu erkennen, die Maus klickt und zieht auf Leerzeichen? (Antwort unten)
Hinweis: ich weiß, es mag nicht als richtige ViewModel, wenn es direkt der Verarbeitung von Ereignissen in der Ansicht. Aber der wichtige Punkt ist, ich muss um Maus-events, und ich bin nicht sicher, wie Sie Sie, um Sie zu befestigen.
InformationsquelleAutor Qwertie | 2009-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine Möglichkeit zum behandeln von Ereignissen ausgelöst, die durch Objekte in der DataTemplate.
(1) anfügen von Ereignishandlern an ItemsControl
(2), um herauszufinden, welches Objekt das Ereignis gilt, behandeln die OriginalSource als FrameworkElement und seine DataContext:
InformationsquelleAutor Qwertie
ViewModel sollte getrennt werden von der GUI, so dass es weiß nichts über die Steuerung oder Mausklicks.
Zwei Optionen:
Check out codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx für ein Beispiel, wie man einen beweglichen Daumen Steuern.
Das Projekt bewegt sich einfach den Daumen in die code-behind-durch den Umgang mit dem DragDelta Veranstaltung.
Ja. Sie wollen nicht, dies zu tun?
InformationsquelleAutor Cameron MacFarland
Dachte ich, die Antwort auf die zweite Frage. Ich brauchte ein ItemsControl, die unterstützt scrollen, und ich brauchte, um die Elemente auf einem Raster eher als die Standard-StackPanel-Steuerelement. Erfüllen beide Anforderungen, die ich verwendet, ein ControlTemplate:
Um Maus-events mit sinnvollen Maus-Koordinaten (also die Koordinaten, in durchlaufbaren Platz), war es notwendig, um eine Referenz auf das Gitter mit einer seltsamen Beschwörung:
Dann befestigen Sie event-Handler, um das raster und das innere der Maus-event-Handler, die Maus-Koordinaten w.r.t. das Gitter mit
Um mouse-events auf der gesamten Oberfläche, die die Steuerung (eigentlich die grid) müssen einen hintergrund, so dass ich set Background="lightyellow festlegen" oben, die sich ausbreitet, um das raster über eine Bindung im ControlTemplate.
InformationsquelleAutor Qwertie
Bea Stollnitz verfügt über eine drag-and-drop Beispiel mit dem Titel "Wie kann ich drag & drop-Elemente zwischen Daten gebunden ItemsControls?". Ich würde den link posten, aber StackOverflow ist nicht lassen Sie mich.
Möchten Sie vielleicht aufgeteilt, die UI-feedback während ist ein ziehen in der Prozess-und die Aktion die ausgeführt wird, wenn es schließlich sank.
Dem würde ich Zustimmen w/Thomas und Cameron vor, jedoch. Sie wollen zu begrenzen mischen/passende event-handling und data binding. Wenn du gehst, die event-handling-Strecke, Sie können nicht wollen, um zu vermeiden, mit dem Begriff "View-Model" für die Objekte, wie es allgemein bezeichnet die Datenbindung alternative.
Dies ist nicht wirklich nützlich für mich, aber danke für den interessanten Artikel!
InformationsquelleAutor micahtan
Gibt es Möglichkeiten, das zu tun, ohne code-behind...
Können Sie mit der beigefügten Verhalten pattern map-Ereignisse, Befehle, siehe Marlon Grech Umsetzung hier
Können Sie auch ein markup-Erweiterung, die ich schrieb, zu binden InputBindings zu ViewModel Befehle wie folgt :
Aber ich bin nicht sicher, es passt Ihre spezifischen Bedürfnisse...
InformationsquelleAutor Thomas Levesque
Ich bin mit einem viel elegantere Methode. Ich benutze Prism 2 und datatemplates. Also, was ich gemacht habe, ist dies:
und in der ItemTemplate-ich habe gerade eine Knopf im inneren!
InformationsquelleAutor VJ Koganti