3

我正在尝试将 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 StackPanelPlacementTarget仍然什么都没有,这似乎表明这不是 WindowsFormsHost 的问题。

4

1 回答 1

1

为什么不尝试不同的方法,并将DataContext整个窗口作为StaticResourceWindows.Resources 中的一个。然后您的命令绑定将如下所示:

<MenuItem Header="Save" 
        Command="{Binding Source={StaticResource MainViewModel}, Path=SaveCommand}" />
于 2013-04-26T12:41:12.047 回答