2

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

我正在尝试 MV-VM 模式。我的 windows 的 datacontext 是MainWindowViewModel具有属性的Transactions。此属性返回ObservableCollection<TransactionViewModel>,并且数据网格使用此集合作为其项目源。所以基本上每一行都是有界的TransactionViewModel(你可以猜到,这个网格列出了交易)。MainWindowsViewModelhasICollectionView用于过滤和跟踪当前选定的行。将DataGrid其属性IsSynchronizedWithCurrentItem设置为“true”,因此myCollectionView.CurrentItem给了我当前选择的TransactionViewModel.

我仍然需要知道的唯一一件事是我需要过滤哪一列。这取决于用户单击上下文菜单的位置。所以我试图使用CommandProperty上下文菜单项传递这些信息。在这里我有一个真正的问题。我试过这个:

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

这真的很难看,但这适用于DataGridTextColumns。不幸的是,我也有DataGridTemplateColumns,但它们不起作用(那里的路径不同,因为我需要到达实际的单元格模板)...

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

谢谢你。

4

2 回答 2

0

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

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

于 2009-07-23T14:34:13.293 回答
0

为什么不直接将单元格作为参数传递,如下所示:

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

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

于 2009-11-15T02:08:07.247 回答