WPF-Ereignisbindung an ViewModel (für Nicht-Befehlsklassen)
Arbeite ich die zweite version einer Anwendung, und als Teil der rewrite-ich habe zu bewegen, um eine MVVM-Architektur. Ich bin immer Druck zu setzen absolut jedes bit der code in der Ansicht Modell-Klasse--unter c# im code-behind-Datei verpönt ist. (Ich weiß, ich weiß...ich verstehe, dass der code dahinter nicht schlecht ist, aber es ist nicht mein Anruf dieser Zeit).
Für Objekte, die Umsetzung der Kommando-Schnittstelle, ist es einfach. Ich habe in der Lage zu finden eine Tonne Informationen auf, wie binden Sie den Befehl diese Objekte zu einem ICommand in der Ansicht Modell. Das problem ist für Objekte, die nicht über diese Schnittstelle, z.B.
<ListBox
x:Name="myListBox"
MouseDoubleClick="myCallbackFunction">
<!-- ... -->
</ListBox>
Möchte ich wissen, wie das binden der MouseDoubleClick-Ereignis für das Listenfeld, um myCallbackFunction, die umgesetzt wird in der Ansicht Modell. Ist das überhaupt möglich?
Dank!
InformationsquelleAutor der Frage RobotNerd | 2011-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht direkt möglich. Es könnte getan werden, über eine Angefügte Eigenschaft oder das Verhalten, auch wenn es noch ein wenig schwierig zu finden, und rufen Sie die entsprechende Methode (dies könnte getan werden, per Reflection ziemlich leicht).
Dass gesagt wird, dies ist in der Regel direkt über
ICommand
- Zum Beispiel, MVVM Light hat eine große EventToCommand Verhalten zu anzeigen jeden Fall eine ICommand auf das ViewModel. Der Vorteil der Verwendung von ICommand ist, dass Sie immer noch mit DataBinding, da die ICommand ausgesetzt ist als eine Eigenschaft.InformationsquelleAutor der Antwort Reed Copsey
Direkt Ihre Frage beantworten, bitte Warum vermeiden Sie die codebehind-WPF-MVVM-Muster? Es schlägt zwei mögliche Dinge, die Sie wollen.
Aber warum wollen Sie zum binden der MouseDoubleClick der ListBox zu Ihrem ICommand im viewmodel?
Die alternative ist, dass Sie schreiben Sie eine Methode im codebehind zu registrieren, MouseDoubleClick. Es ist nicht schlecht, aufgrund der Fakten, die der folgenden.
Den sinnvollen databinding ist die Interaktion zwischen view und ein viewmodel. Zum Beispiel, wenn ein Benutzer Eingaben text an ein Textfeld, ein viewmodel ist auch aktualisiert. Im Gegenteil, wenn ein viewmodel bekommt die Daten aus einer Datenbank, es zeigt auf eine Ansicht. Es ist jedoch nicht in diesem Fall, dass die ICommand in der viewmodel bindet den Blick.
Natürlich, die CanExcute der ICommand wäre wichtig, um Ihr viewmodel, aber in vielen Fällen ist es nicht im Zusammenhang mit dem viewmodel oder nicht besorgt. In diesem Fall wird der Unterschied zwischen der ICommand binden und die schreiben den codebehind ist, wo der MouseDoubleClick-Ereignis ist gebunden mit einem ICommand oder registriert einen event-handler.
InformationsquelleAutor der Antwort Jin-Wook Chung
WPF unterstützt die markup-Erweiterungen auf Ereignisse .NET 4.5. Mit dieser Fähigkeit, ich implementiert eine unglaublich vielseitige Methode, die Bindung Erweiterung und schrieb darüber hier:
http://www.singulink.com/CodeIndex/post/building-the-ultimate-wpf-event-method-binding-extension
Kann verwendet werden, um eine Bindung an eine Methode mithilfe der Eigenschaft path-syntax, unterstützt die Bindungen und andere markup-Erweiterungen als Argumente, und automatisch Routen, die der Methode entspricht der Signatur der Argumente. Hier sind einige Beispiele:
View-model-Methode Unterschriften:
InformationsquelleAutor der Antwort Mike Marynowski
Ein Weg sein könnte, um die Ereignisbehandlung in der code-behind und call geeignete Methode der view-Modell aus code, der sich hinter
Können Sie auch für einige gehen bereit gemacht Kommandierender Bibliothek, wie diese tutorial, das mit ACB
InformationsquelleAutor der Antwort Haris Hasan