将ContextMenu的原点传递给WPF命令

Jos*_*h G 5 wpf xaml mvvm

与上下文菜单项中的命令相关的有趣问题...

我想触发一个命令在我的控件InsertRowCmd中插入一行.此命令需要知道插入行的位置.

我可以使用Mouse.GetPosition(),但这会让我当前的鼠标位置,这将在菜单项上.我想获得上下文菜单的来源.

有没有人建议如何将上下文菜单的来源作为参数传递给命令?

示例代码:

<UserControl x:Name="MyControl">
<!--...-->
        <ContextMenu x:Name="menu">
            <MenuItem Header="Insert Row" Command="{x:Static customCommands:MyCommands.InsertRowCmd}" CommandParameter="?"/>
        </ContextMenu>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

我目前的想法如下:

- 使用单击处理程序,以便我可以在代码中找到原点.问题是我必须处理启用/禁用.

-Handle单击事件并保存上下文菜单的原点.将此保存的信息传递给命令.我已经验证了在执行命令之前触发了click事件.

有任何想法吗?

编辑:

我正在使用Josh Smith的CommandSinkBinding将命令处理路由到我的ViewModel类.因此,处理命令执行的代码对视图一无所知.

Ken*_*art 5

您需要使用TranslatePoint将左上角(0,0)转换为ContextMenu包含网格中的坐标.你可以通过绑定CommandParameterContextMenu并使用转换器来实现:

CommandParameter="{Binding IsOpen, ElementName=_menu, Converter={StaticResource PointConverter}}"
Run Code Online (Sandbox Code Playgroud)

另一种方法是附加行为,Point无论何时ContextMenu打开,它都会自动更新类型的附加只读属性.用法看起来像这样:

<ContextMenu x:Name="_menu" local:TrackBehavior.TrackOpenLocation="True">
    <MenuItem Command="..." CommandParameter="{Binding Path=(local:TrackBehavior.OpenLocation), ElementName=_menu}"/>
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)

因此,只要打开,附加属性就会TrackOpenLocation附加到ContextMenu并更新第二个附加属性(OpenLocation)ContextMenu.然后,MenuItem只需绑定即可OpenLocation获得ContextMenu上次打开的位置.