2010-09-18 9 views
5

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?

+0

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

+0

@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

+2

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

Antwort

1

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.

+0

Die Lösung des Problems für MVVM ist, das Ereignis zu behandeln, denke ich. :) –

+0

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

0

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?

-1

"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.

+0

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

+0

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. –

+0

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

0

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).

Verwandte Themen