2009-07-23 15 views
2

(WPFツールキットの)WPF DataGridのフィルタリング機能を開発しようとしています。ユーザーが任意のセルを右クリックし、そのCcontextMenuからFilterを選択し、セルの値でグリッドをフィルタリングする必要があります。WPF DataGrid:フィルタリングのカラムバインディングプロパティを取得する

私はM-V-VMパターンを試しています。私の窓のdatacontextはを持つMainWindowViewModelです。このプロパティはObservableCollection<TransactionViewModel>を返し、データグリッドはこのコレクションをアイテムソースとして使用します。したがって、基本的に各行はTransactionViewModelに限定されています(このグリッドはトランザクションを示しています)。 MainWindowsViewModelICollectionViewです。これは、現在選択されている行のフィルタリングとトラッキングに使用されます。 DataGridのプロパティーはIsSynchronizedWithCurrentItemが "true"に設定されているので、myCollectionView.CurrentItemは現在選択されているTransactionViewModelを返します。

私がまだ知る必要があるのは、どの列をフィルタリングする必要があるかだけです。これは、ユーザーがコンテキストメニューをクリックした場所によって異なります。だから、コンテキストメニュー項目のCommandPropertyを使ってこの情報を渡そうとしています。そして、私は本当の問題を抱えています。私はこれを試してみました:

CommandParameter="{Binding Column.Binding.Path.Path, 
             RelativeSource={RelativeSource FindAncestor, 
                 AncestorType={x:Type tk:DataGridCell}}}" /> 

これは本当に醜いですが、これはDataGridTextColumn秒間動作します。残念ながら、DataGridTemplateColumnもあります。実際のセルテンプレートに到達する必要があるため、パスは異なります。

この機能はどのように実装できますか?おそらく全体の方法が間違っているでしょうか?私はそれについて貴重な例は見つけられませんでした。私が見つけた唯一の事は何らかの理由でWPF DataGridオートコードの実装がCodeprojectで全く機能しないことです。

ありがとうございます。あなたはMainWindowViewModelで双方向モードでそれを結合することができるようCurrentCellを、これは役立つだろうけど...

データグリッドがある場合

答えて

0

は、私は100%確実ではないです。 その後、すべての「行」は、MainWindowViewModelで定義されたDoFilterコマンドを指すことができます。それは美しさの解決策ではありません(viewmodelはDataGrid Cellタイプを知っている必要があるため)が、動作するはずです。

CommandParameter= 
    "{Binding RelativeSource={RelativeSource FindAncestor,tk:DataGridCell,1}}" /> 

をして、コマンドの実行されたイベントは、実際の列名を見つけるのすべてのハードの部分を処理してみましょう:

0

なぜだけではなく、このようなパラメータとしてセルを渡しますか?そうすれば、必要なすべての特殊なコードを書くことができます。

関連する問題