2009-07-20 21 views
3

MVVMパターンを使用してWPFアプリケーションを作成しようとしています。私は、autofiltering機能が不足しているWPFデータグリッド(ツールキットから)を使用しています。だから私はそれを実装したい。私は、実際にフィルタリングメソッドを呼び出す必要があります "フィルタ"と呼ばれるMenuItemを持っている、列ヘッダーテンプレートにコンテキストメニューを追加しました。WPF MVVM:どのヘッダコンテキストメニューがクリックされたかを調べる

私は、ViewModelに行く適切なDelegateCommandになるようにMenuItemのコマンドを設定しました。問題は、右クリックされた実際の列に関する情報を渡す必要があることです。私はMVVMを使用していない場合は、 "送信者"引数(MenuItem)を受け取るイベントハンドラを実装すると、その親(ContextMenu)を見つけるだろうし、その親は私に列を与えるだろう。しかし、私はここで同じことをどのように達成できますか?送信者を私のコマンドにどのように渡すことができますか? ComandParameterを使ってこれを行うことはできますか?

私は本当にこのような簡単な作業を達成するために、複雑なパターンを追加したくありません。結局のところ、MVVMは開発を簡略化し、その逆はできません。

答えて

1

ViewModelでColumnの詳細を取得するには、CommandパラメータとしてColumnヘッダーの値を渡しますか?

+0

どうすればよいですか?

+1

だけのDataContextは デフォルトバインディング –

0

相対的なソースマジックを試すこともできますが、HeaderViewModelItemのようにヘッダーごとに異なるViewModelをバインドすることができます。そこから、あなたのHeaderViewModelItemにDelegateCommandを呼び出すだけで、より大きなビューモデルにすることができます。

私はこのモデルをかなり成功裏に使用しました。データバインディングダンスの少しの周りを取得します。

0

コマンドパラメータに何かを渡す場合は、コンテキストメニューが独自のビジュアルツリーにあることに注意することが重要です。幸いにもそれはまだ親からのDataContextを継承し、そう

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

のようなものは、あなたにGridViewColumnHeaderを取得、またはそのビジュアルツリー内の少なくとも何かする必要があります。

+0

はいつものDataContext、 あるは、DataContextがMenuItemに継承されるので十分です。 –

+0

これは、MenuItemsの生成方法によって異なります。それらがBindingを介して生成される場合、それらは親と同じDataContextを持たないでしょう。 –

関連する問題