2009-07-23 167 views
2

我正在尝试为WPF DataGrid(来自WPF工具包)开发过滤功能。我想要一个用户右键单击任何单元格,然后从CcontextMenu中选择Filter,然后应根据单元格的值过滤网格。WPF DataGrid:获取列绑定属性进行过滤

我正在尝试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 s,他们不工作(路径是不同的,因为我需要达到实际的单元格模板)...

那么我怎么能实现这个功能?也许整个过程都是错误的?我没有找到任何有价值的例子。我唯一发现的是WPF DataGrid自动过滤器在Codeproject上的实现,由于某种原因根本不工作...

谢谢。

回答

0

我不是100%肯定这是否会帮助,但...

DataGrid中有CurrentCell,所以你可以在你的MainWindowViewModel在双向模式绑定。 然后每个“行”都可以指向在MainWindowViewModel中定义的DoFilter命令。这不是一个美丽的解决方案(因为viewmodel必须知道DataGrid单元格类型),但它应该工作。

0

为什么不通过小区像这样的参数:

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

,让你的命令的执行的事件处理发现实际的列名的所有困难的部分?这样你可以编写你需要的所有特例代码。

相关问题