WPF MVVM:找出点击了哪个标题上下文菜单

3
我正在尝试使用MVVM模式编写WPF应用程序。我正在使用WPF数据网格(来自工具包),它缺少自动过滤功能。因此,我想要实现它。我已经将上下文菜单添加到列标题模板中,它有一个名为“Filter”的MenuItem,实际上应该调用过滤方法。
因此,我已将MenuItem的命令设置为适当的DelegateCommand,该命令转到ViewModel。问题是我需要传递关于实际右键单击的列的信息!如果我不使用MVVM,我将实现一个事件处理程序,该处理程序将接收“sender”参数(MenuItem),然后我将找到其父项(ContextMenu),然后其父项将给我列。但是在这里我如何实现相同的功能?如何将sender传递给我的命令?这可以使用ComandParameter完成吗?
我真的不想使用其他复杂的模式来完成这样一个简单的任务。毕竟,MVVM应该简化开发而不是相反...
3个回答

1
你能否将列标题值作为命令参数传递,并在ViewModel中使用它来获取列的详细信息?

我该怎么做?像这样<MenuItem CommandParameter="{RelativeSource AccessorType=DataGridColumnHeader, Path=Header}"? 如果我正在使用来自Codeplex的MVVM工具包,那么我怎么在ViewModel中获取CommandParameter?它们的DelegateCommand不会传递参数... - Dmitry Perets
1
只需要一个DataContext绑定就可以解决问题了。 <MenuItem CommandParameter="{Binding}" .../> - Jobi Joy

0
如果您想将某些内容传递到命令参数中,重要的是要注意上下文菜单是独立的可视树。幸运的是,它仍然从其父级继承DataContext,因此可以使用类似以下代码的方式进行操作:
<MenuItem CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}" />

应该可以获取到GridViewColumnHeader,或者至少是它在可视树中的某个元素。


默认的绑定始终是DataContext, <MenuItem CommandParameter="{Binding}" .../>已足够,因为DataContext也会被继承到MenuItem。 - Jobi Joy
这取决于菜单项是如何生成的。如果它们是通过绑定自动生成的,它们将不具有与父级相同的数据上下文。 - Bryce Kahle

0

你可以尝试一些相关的源代码魔法,但如果你可以为每个标题绑定到不同的ViewModel,比如HeaderViewModelItem,那么对你来说可能会更容易。从那里开始,在你的HeaderViewModelItem中只需触发一个DelegateCommand,而不是在你的较大的ViewModel中。

我已经使用过这个模型,取得了相当不错的成功。它可以避免一些数据绑定上的麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接