3

MVVM パターンを使用して WPF アプリケーションを作成しようとしています。自動フィルタリング機能がない WPF データ グリッド (ツールキットから) を使用しています。ということで実装したいと思います。列ヘッダー テンプレートにコンテキスト メニューを追加しました。これには、実際にフィルタリング メソッドを呼び出す「Filter」という MenuItem があります。

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

このような単純なタスクを達成するために、追加の複雑なパターンを使用したくありません。結局のところ、MVVM は開発を簡素化する必要があり、その逆ではありません...

4

3 に答える 3

1

列ヘッダーの値をコマンド パラメータとして渡し、それを使用して ViewModel で列の詳細を取得できますか?

于 2009-07-20T22:12:07.747 に答える
0

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

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

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

于 2009-07-22T04:41:34.823 に答える
0

相対ソース マジックを試すこともできますが、HeaderViewModelItem のように、ヘッダーごとにバインドする別の ViewModel を使用できると、より簡単になる場合があります。そこから、より大きなビューモデルではなく、HeaderViewModelItem で DelegateCommand を起動するだけです。

私はこのモデルを使用してかなりの成功を収めました。少しのデータバインディング ダンスを回避します。

于 2009-07-21T01:31:23.113 に答える