2009-07-20 6 views
3

Ich versuche, das MVVM-Muster zu verwenden, um eine WPF-Anwendung zu schreiben. Ich verwende das WPF-Datenraster (aus dem Toolkit), dem die Autofilterfunktion fehlt. Also ich möchte es implementieren. Ich habe der Spaltenüberschriftvorlage ein Kontextmenü hinzugefügt, das MenuItem heißt "Filter" und sollte eigentlich die Filtermethode aufrufen.WPF MVVM: Finden Sie heraus, auf welche Header Kontextmenü geklickt wurde

Also habe ich einen MenuItem-Befehl als den passenden DelegateCommand festgelegt, der an das ViewModel geht. Das Problem ist, dass ich die Information über die tatsächliche Spalte weitergeben muss, die mit der rechten Maustaste geklickt wurde! Wenn ich MVVM nicht verwenden würde, würde ich einen Event-Handler implementieren, der ein "sender" -Argument (das MenuItem) erhalten würde, dann würde ich sein Elternelement (das ContextMenu) finden, dann würde sein Elternteil mir die Spalte geben. Aber wie kann ich hier dasselbe erreichen? Wie kann ich den Absender an meinen Befehl übergeben? Kann dies mit ComandParameter geschehen?

Ich möchte wirklich nicht zusätzliche komplizierte Muster verwenden, um so eine einfache Aufgabe zu erreichen. Immerhin sollte MVVM die Entwicklung vereinfachen und nicht umgekehrt ...

Antwort

1

Können Sie den Column-Header-Wert als Befehlsparameter übergeben und damit die Column-Details im ViewModel abrufen?

+0

Wie mache ich das? Etwas wie

+1

Nur eine DataContext-Bindung macht den Trick

0

Sie könnten eine relative Quell-Magie ausprobieren, aber es könnte für Sie einfacher sein, wenn Sie ein anderes ViewModel haben können, an das Sie für jeden Header binden, wie HeaderViewModelItem. Von dort würden Sie nur einen DelegateCommand in Ihrem HeaderViewModelItem auslösen, eher auf Ihrem größeren ViewModel.

Ich habe dieses Modell mit ziemlich gutem Erfolg verwendet. Ruft ein bisschen Databinding-Tanz herum.

0

Wenn Sie etwas in den Befehlsparameter übergeben möchten, ist es wichtig zu beachten, dass ein Kontextmenü in einem eigenen visuellen Baum ist. Glücklicherweise erbt es immer noch die Datacontext von seinen Eltern, so etwas wie

<MenuItem CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}" /> 

sollten Sie die Gridviewcolumnheader bekommen, oder zumindest etwas in der visuellen Struktur davon.

+0

Die Standardbindung ist immer DataContext, ist genug, da DataContext auch an das MenuItem vererbt wird. –

+0

Das hängt davon ab, wie die MenuItems generiert werden. Wenn sie selbst über eine Bindung generiert werden, hätten sie nicht den gleichen DataContext wie die Eltern. –