我正在尝试将 ContextMenu 绑定到 ViewModel 的命令。经过网上搜索,我了解到由于 ContextMenu 不属于目标可视化树,因此我需要使用例如 Tag 和 PlacementTarget.Tag 显式指定 ContextMenu 的 DataContext。我将 ContextMenu 附加到的 UIElement 是 WindowsFormsHost。我不知道这是否有问题,我稍后会解释为什么我会这么说。我的 xml 看起来像这样:
<WindowsFormsHost Name="myHost1" Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=Self}}">
<WindowsFormsHost.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" x:Name="test">
<MenuItem Header="Save" Command="{Binding SaveCommand}" />
...
但是这段代码根本行不通。
我给 UIElements 加上了一些名字,这样我就可以在代码隐藏中检查它们。这是我发现的:myHost1.Tag
正确分配给我的 ViewModel,它具有正确的命令。但是,DataContext
我的 ContextMenu 对象什么都不是,这意味着我的第二个绑定不起作用。然后当我检查时test.PlacementTarget
,我惊讶地发现它什么都不是。难怪第二个绑定不起作用。
根据MSDN,该PlacementTarget
属性是“相对于 ContextMenu 打开时定位的 UIElement”。因此,据我了解,当我检查时test.PlacementTarget
,它应该返回 myHost1 类型WindowsFormsHost
。但为什么它什么都不是?
我说我不知道是否WindowsFormsHost
特别,因为它包含一些 WindowsFom 控件,这些控件的呈现方式与 WPF 不同。例如,myHost1
实际上是托管一个AxPivotTable
有自己的上下文菜单。我必须做一些额外的工作才能使我的 WPF 上下文菜单可见并隐藏AxPivotTable
上下文菜单。另一方面,当我将 ContextMenu 对象放入 myHost1 的父级时,即 a StackPanel
,PlacementTarget
仍然什么都没有,这似乎表明这不是 WindowsFormsHost 的问题。