WPF DataGrid:获取用于过滤的列绑定属性

时间:2009-07-23 12:15:46

标签: wpf mvvm datagrid binding wpftoolkit

我正在尝试为WPF DataGrid(来自WPF工具包)开发过滤功能。我希望用户右键单击任何单元格并从其Filter中选择CcontextMenu,然后应按单元格的值过滤网格。

我正在尝试M-V-VM模式。我的windows的datacontext是MainWindowViewModel,其属性为Transactions。此属性返回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 s。不幸的是,我还有DataGridTemplateColumn,它们不起作用(那里的路径不同,因为我需要到达实际的单元格模板)...

那么我该如何实现这个功能呢?也许整条路都错了?我没有找到任何有价值的例子。我发现的唯一的事情是Codeproject上的WPF DataGrid自动过滤器实现,由于某种原因根本不起作用......

谢谢。

2 个答案:

答案 0 :(得分:0)

我不能100%确定这是否会有所帮助,但是......

DataGrid具有CurrentCell,因此您可以在MainWindowViewModel中以TwoWay模式绑定它。 然后每个“行”都可以指向MainWindowViewModel中定义的DoFilter命令。它不是一个美容解决方案(因为viewmodel必须知道DataGrid Cell类型),但它应该可以工作。

答案 1 :(得分:0)

为什么不直接将单元格作为参数传递:

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

让你的命令的Executed事件处理查找实际列名的所有困难部分?这样你就可以编写所需的所有特例代码。