WPF MVVM:找出已单击的标题上下文菜单

时间:2009-07-20 21:29:11

标签: wpf mvvm contextmenu wpftoolkit menuitem

我正在尝试使用MVVM模式编写WPF应用程序。我正在使用缺少自动过滤功能的WPF数据网格(来自工具包)。所以我想实现它。我已经在列标题模板中添加了一个上下文菜单,它有一个名为“Filter”的MenuItem,它实际上应该调用过滤方法。

所以我将MenuItem的命令设置为适当的DelegateCommand,它转到ViewModel。问题是我需要传递有关右键单击的实际列的信息!如果我没有使用MVVM,我会实现一个事件处理程序,它将接收一个“sender”参数(MenuItem),然后我会找到它的父(ContextMenu),然后它的父将给我列。但是我怎样才能在这里实现同样的目标呢?如何将发件人传递给我的命令?可以使用ComandParameter完成吗?

我真的不想使用额外的复杂模式来完成这么简单的任务。毕竟,MVVM应该简化开发,而不是反过来......

3 个答案:

答案 0 :(得分:1)

您可以将Column标头值作为命令参数传递,并使用它来获取ViewModel中的Column详细信息吗?

答案 1 :(得分:0)

您可以尝试一些相对源魔术,但如果您可以为每个标头绑定不同的ViewModel(例如HeaderViewModelItem),则可能会更容易。从那里你只需要在你的HeaderViewModelItem中触发DelegateCommand,而不是你的更大的viewmodel。

我使用这个模型取得了相当不错的成功。绕过一些数据绑定舞蹈。

答案 2 :(得分:0)

如果要将某些内容传递给命令参数,请务必注意上下文菜单位于其自己的可视树上。幸运的是,它仍然从其父级继承DataContext,所以类似于

<MenuItem CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}" />

应该为你提供GridViewColumnHeader,或至少在它的可视化树中。