【问题标题】:ContextMenu.PlacementTarget is nothing in WPFContextMenu.PlacementTarget 在 WPF 中什么都不是
【发布时间】: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时,我惊讶地发现它什么都不是。难怪第二个绑定不起作用。

根据MSDNPlacementTarget 属性是“相对于 ContextMenu 打开时定位的 UIElement”。因此,据我了解,当我检查 test.PlacementTarget 时,它应该返回 myHost1,它的类型为 WindowsFormsHost。但是为什么什么都没有呢?

我说我不知道​​WindowsFormsHost 是否特别,因为它包含一些WindowsFom 控件,这些控件的呈现方式与WPF 不同。例如,myHost1 实际上托管了一个 AxPivotTable,它有自己的上下文菜单。我必须做一些额外的工作才能使我的 WPF 上下文菜单可见并隐藏 AxPivotTable 上下文菜单。另一方面,当我将 ContextMenu 对象放入 myHost1 的父级时,即StackPanelPlacementTarget 仍然没有,这似乎表明这不是 WindowsFormsHost 的问题。

【问题讨论】:

    标签: wpf data-binding contextmenu datacontext


    【解决方案1】:

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

    <MenuItem Header="Save" 
            Command="{Binding Source={StaticResource MainViewModel}, Path=SaveCommand}" />
    

    【讨论】:

    • 一方面,这不是 MainView 中的上下文菜单。它来自 UserControl,并且 ViewModel 是动态创建的。实际上 ViewModel 具有继承层次结构,所以我不能将它存储为静态资源。
    猜你喜欢
    • 2011-06-11
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2010-10-22
    • 2015-01-09
    • 2014-05-14
    相关资源
    最近更新 更多