【发布时间】:2013-04-20 15:05:33
【问题描述】:
我正在尝试将 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,它具有正确的命令。但是,我的 ContextMenu 对象的 DataContext 什么都不是,这意味着我的第二个绑定不起作用。然后当我检查test.PlacementTarget时,我惊讶地发现它什么都不是。难怪第二个绑定不起作用。
根据MSDN,PlacementTarget 属性是“相对于 ContextMenu 打开时定位的 UIElement”。因此,据我了解,当我检查 test.PlacementTarget 时,它应该返回 myHost1,它的类型为 WindowsFormsHost。但是为什么什么都没有呢?
我说我不知道WindowsFormsHost 是否特别,因为它包含一些WindowsFom 控件,这些控件的呈现方式与WPF 不同。例如,myHost1 实际上托管了一个 AxPivotTable,它有自己的上下文菜单。我必须做一些额外的工作才能使我的 WPF 上下文菜单可见并隐藏 AxPivotTable 上下文菜单。另一方面,当我将 ContextMenu 对象放入 myHost1 的父级时,即StackPanel,PlacementTarget 仍然没有,这似乎表明这不是 WindowsFormsHost 的问题。
【问题讨论】:
标签: wpf data-binding contextmenu datacontext