MVVM lässt keinen Code zurück und damit Ereignisbehandlung. Also, was ist der MVVM Weg, benachrichtigt zu werden, dass eine Zelle geändert wurde?Wie behandelt man das Wpf DataGrid CellEditEnding-Ereignis in MVVM?
Antwort
Es ist eine ziemlich echt und offensichtliche Frage, da es ziemlich legit Lösungen für das Problem für MVVM sind. Ich nehme an, jemand hat es niedergeschrieben, weil das wahrscheinlich schon unzählige Male zuvor gestellt wurde.
Ich weiß, dass in .Net4 etwas eingebaut ist. Ich stecke bei .Net3.5 fest, also verwende ich die CommandReference-Klasse aus dem WPF-Toolkit, um ein Ereignis in der Ansicht in einen Befehl in einem View-Modell zu konvertieren.
Die Lösung des Problems für MVVM ist, das Ereignis zu behandeln, denke ich. :) –
Aber "wie" ist die Frage !! Sie können keine Ereignisbehandlungsroutinen hinzufügen, ohne MVVM zu beschädigen. Mit der Befehlsreferenz können Sie ein Ereignis in der Benutzeroberfläche in einen Befehl in der VM konvertieren. – NVM
Müssen Sie das CellEditEnding-Ereignis behandeln? Wäre es möglich, den Code im Setter der Eigenschaft auszuführen, die an die Zelle gebunden ist?
"MVVM nicht erlaubt Code hinter und so Handhabung Ereignis."
Whoops! Da ist das Problem.
MVVM schreckt Code hinter, es ist wahr, aber nur, wenn etwas vernünftigerweise über XAML erfolgen. "Du sollst nicht code-behind" wurde von niemandem mit einer Ahnung gesagt.
Manchmal ist die Handhabung eines Ereignisses der einfachste und beste Weg, um Ihr Ziel zu erreichen. Wenn das der Fall ist, umarme es, löse dein Problem und gehe weiter. Manchmal ist es nicht einmal möglich, Ihr Ziel in XAML zu erreichen. Werfen Sie in diesen Fällen die View-Logik in den Code-Behind der Ansicht und fahren Sie fort.
Es ist weitaus wichtiger, die architektonischen Ziele von MVVM (Trennung von Belangen zwischen Layern) beizubehalten, als strikte Einhaltung von Faustregeln (z. B. Vermeidung von Code-Behind). Wenn diese Unterscheidung nicht getroffen wird Du vermisst den Wald für die Bäume.
Nun, du hast recht und du liegst falsch. Wenn Sie etwas Code hinter nur für einige reine UI-Sachen hinzufügen, ist es in Ordnung. Aber sagen Sie, wenn das Endbearbeitungs-Event der Zelle etwas in Ihrem Modell (über Ihre VM) aktualisiert, dann ist es eine sehr sehr schlechte Idee (IMO). – NVM
Es hängt davon ab, wie gut Ihr Modell für die Arbeit in einem DataGrid geeignet ist. In einer Situation, in der ich @work gerade jetzt habe, bin ich gezwungen, ein einzeiliges Datagrid zu verwenden, um ein einzelnes Objekt darzustellen.Die VM wird keine Sammlung dieser Gegenstände aufdecken, die immer nur eine Instanz enthalten kann, das wäre eine lächerliche Konzession auf der VM-Seite für eine seltsame Anforderung in dem V. Vielmehr ist das V für die Transformation verantwortlich Was die VM als eine tatsächliche Anwendung verfügbar macht, muss in was sie benötigt. –
Ich bin mir nicht sicher, ob ich verstehe, was dein Szenario ist. Aber ich stimme der Aussage nicht zu, dass "die Ansicht dafür verantwortlich ist, zu transformieren, was die VM darstellt". Die Ansicht ist dafür verantwortlich, zu zeigen, was die VM verfügbar macht. Die VM ist verantwortlich für die Transformation des Modells. Eine Ansicht sollte die VM nur auffordern, im Modell basierend auf der Benutzeranforderung Dinge zu transformieren. Die Ansicht hat nichts mit dem Modell zu tun, für das die VM verantwortlich ist. Und die VM existiert genau deshalb, weil Modelle nicht direkt für Arbeitsansichten geeignet sind (wie Datagridview). – NVM
Da wurde nie eine Antwort auf diese Frage markiert; Was Sie wollen, ist eine "Event to Command" Implementierung. Grundsätzlich erfasst es ein Ereignis Ihrer Wahl und ruft eine ICommand
Implementierung auf Ihrem ViewModel auf.
bereits beantwortet here in der Zusammenfassung (Antwort von Derek Beattie überprüfen).
- 1. WPF MvvM DataGrid Dynamische Spalten
- 2. ScrollIntoView für WPF DataGrid (MVVM)
- 3. WPF MVVM DataGrid abgerufene Zeilen
- 4. Wie behandelt man Ereignisse in MVVM
- 5. WPF Datacontext nicht aktualisiert das Datagrid mit MVVM Modell
- 6. CollectionViewSource MVVM-Implementierung für WPF DataGrid
- 7. WPF: Wie man Spaltenüberschrift in Datagrid einfriert
- 8. MVVM WPF ComboBox SelectedItem Bindung nicht aktiviert in Datagrid
- 9. Programmatische Darstellung einer DataGrid-Zeile in WPF, MVVM
- 10. Wie behandelt man WndProc Nachrichten in WPF?
- 11. Dynamische Spaltengenerierung in WPF DataGrid
- 12. Wie aktualisiert man DataGrid in WPF von einem anderen Fenster ohne MVVM?
- 13. Ausgewähltes ViewModel von WPF datagrid an neues TabItem MVVM übergeben
- 14. WPF-Datagrid Übergreifende Zeilenüberprüfung
- 15. Wie behandelt man WPF WebBrowser Steuerelement Navigationsausnahme
- 16. MVVM DataGrid-Bindung
- 17. Cascading ComboBox in Datagrid mit MVVM
- 18. WPF DataGrid: Sortiere eine Spalte programmatisch die MVVM-Art?
- 19. WPF/MVVM - Wie behandelt man einen Doppelklick auf TreeViewItems im ViewModel?
- 20. MVVM: Wie behandelt man die Interaktion zwischen verschachtelten ViewModels?
- 21. ICommand in MVVM WPF
- 22. Navigation in WPF MVVM
- 23. DataGridComboBoxColumn Bindungsprobleme in WPF MVVM-Anwendung
- 24. Wie behandelt man das Nummernzeichen ('#') in Dateinamen?
- 25. Wie behandelt man das Datum in Django?
- 26. Wie behandelt man das Frontend in Lumen
- 27. WPF: Wie spielt man ein Storyboard in MVVM?
- 28. WPF-Bildbindung in DataGrid
- 29. Prisma/mvvm: Bindung Spalten Datagrid
- 30. Editierbare Datagrid in WPF
Scheint wie eine legitime Frage an mich, aber vielleicht brauchen Sie ein wenig ausführlicher mit Ihrer Frage zu sein: was genau Sie nicht verstehen, dass die Veranstaltung über den Umgang mit? Möchten Sie wissen, ob es in der Ansicht oder im Viewmodel gemacht werden soll? * (Hier ist ein Hinweis: das ViewModel sollte nichts über das DataGrid wissen.) * – slugster
@sugster - Offensichtlich kann ich dieses Ereignis nicht verwenden, da MVVM Code Behind nicht erlaubt. Also meine Frage ist, was kann ich tun, anstatt dieses Ereignis zu verwenden? – Erez
MVVM verbietet * Code * nicht, es * entmutigt * es einfach und gibt dir ein Muster, um dieses Ideal zu erreichen. Was genau müssen Sie tun, wenn diese Datagrid-Zelle einmal geändert wurde (Ihre Antwort könnte den Ansatz diktieren)? – slugster