2

DataGrid(WPF Toolkit から) WPF のフィルタリング機能を開発しようとしています。ユーザーに任意のセルを右クリックしてから選択FilterしてもらいCcontextMenu、セルの値でグリッドをフィルター処理する必要があります。

MV-VM パターンを試しています。私のウィンドウのデータコンテキストはMainWindowViewModel、プロパティを持つものTransactionsです。このプロパティは を返しObservableCollection<TransactionViewModel>、データ グリッドはこのコレクションをアイテム ソースとして使用します。したがって、基本的に各行はバインドさTransactionViewModelれています (ご想像のとおり、このグリッドにはトランザクションが一覧表示されます)。MainWindowsViewModelこれはICollectionView、現在選択されている行のフィルタリングと追跡に使用されます。のDataGridプロパティIsSynchronizedWithCurrentItemは「true」に設定されているためmyCollectionView.CurrentItem、現在選択されている が表示されTransactionViewModelます。

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

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

これは本当に醜いですが、これはDataGridTextColumns で機能します。残念ながら、私もDataGridTemplateColumns を持っていますが、それらは機能しません (実際のセル テンプレートに到達する必要があるため、そこではパスが異なります)...

では、どうすればこの機能を実装できますか? おそらく全体の方法が間違っていますか?それに関する貴重な例は見つかりませんでした。DataGrid私が見つけた唯一のものは、何らかの理由でまったく機能しない Codeproject での WPFオートフィルターの実装です...

ありがとうございました。

4

2 に答える 2

0

セルを次のようなパラメータとして渡してみませんか。

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

コマンドのExecutedイベントに、実際の列名を見つけるための難しい部分をすべて処理させますか?そうすれば、必要なすべての特殊なコードを記述できます。

于 2009-11-15T02:08:07.247 に答える
0

これが役立つかどうかは100%わかりませんが...

DataGrid には CurrentCell があるため、MainWindowViewModel で TwoWay モードでバインドできます。次に、すべての「行」が、MainWindowViewModel で定義された DoFilter コマンドを指すことができます。ビューモデルは DataGrid Cell タイプを認識している必要があるため、これは美容ソリューションではありませんが、機能するはずです。

于 2009-07-23T14:34:13.293 に答える