我正在尝试为WPF DataGrid
(来自WPF工具包)开发过滤功能。我希望用户右键单击任何单元格并从其Filter
中选择CcontextMenu
,然后应按单元格的值过滤网格。
我正在尝试M-V-VM模式。我的windows的datacontext是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}}}" />
这真的很难看,但这适用于DataGridTextColumn
s。不幸的是,我还有DataGridTemplateColumn
,它们不起作用(那里的路径不同,因为我需要到达实际的单元格模板)...
那么我该如何实现这个功能呢?也许整条路都错了?我没有找到任何有价值的例子。我发现的唯一的事情是Codeproject上的WPF DataGrid
自动过滤器实现,由于某种原因根本不起作用......
谢谢。
答案 0 :(得分:0)
我不能100%确定这是否会有所帮助,但是......
DataGrid具有CurrentCell,因此您可以在MainWindowViewModel中以TwoWay模式绑定它。 然后每个“行”都可以指向MainWindowViewModel中定义的DoFilter命令。它不是一个美容解决方案(因为viewmodel必须知道DataGrid Cell类型),但它应该可以工作。
答案 1 :(得分:0)
为什么不直接将单元格作为参数传递:
CommandParameter=
"{Binding RelativeSource={RelativeSource FindAncestor,tk:DataGridCell,1}}" />
让你的命令的Executed事件处理查找实际列名的所有困难部分?这样你就可以编写所需的所有特例代码。