为什么我不能在上下文菜单中使用DataContext={Binding}?

3

我有类似下面这样的代码:

<HierarchicalDataTemplate
    DataType="{x:Type local:SomeType}"
    ItemsSource="{Binding SomeOtherItems}"
    >
    <DockPanel Margin="4">
        <DockPanel.ContextMenu>
            <local:SomeContextMenu DataContext="{Binding}" />
        </DockPanel.ContextMenu>
        <CheckBox IsChecked="{Binding SomeBooleanProperty, Mode=TwoWay}" />
        <TextBlock
            Margin="4,0"
            Text="{Binding Name}" />
    </DockPanel>
</HierarchicalDataTemplate>

没有上下文菜单时,一切都按预期工作。但是当我添加了这些行:
<DockPanel.ContextMenu>
    <local:SomeContextMenu DataContext="{Binding}" />
</DockPanel.ContextMenu>

我为每个使用“HierarchicalDataTemplate”元素都收到了此(运行时)错误:
System.Windows.Data Error: 3 : 找不到提供DataContext的元素。 BindingExpression:(无路径); DataItem = null; target element是 'SomeContextMenu' (Name =''); target property 是 'DataContext'(类型为 'Object')
为什么绑定可以在除上下文菜单之外的所有内容中正常工作,但不能在上下文菜单中正常工作?
1个回答

17
首先,DataContext="{Binding}" 没有太多意义,因为这会将 DataContext 绑定到自身。问题可能是 ContextMenu 不在逻辑树中,它的可视树是分离的,因为 ContextMenu 是浮动弹出窗口。
尝试通过 PlacementTarget 绑定 DataContext:
 DataContext="{Binding PlacementTarget.DataContext,
                       RelativeSource={RelativeSource Self}}"

啊,这很有道理。我最终通过内联上下文菜单来解决问题,因为它只有一个 MenuItem 并且只在一个地方使用,但是你的解决方案也可以。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接