为什么我不能将DataContext = {Binding}用于我的上下文菜单?

Mat*_*hew 3 .net c# data-binding wpf xaml

我的代码看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

没有上下文菜单,一切都按预期工作.但是当我添加这些行时:

<DockPanel.ContextMenu>
    <local:SomeContextMenu DataContext="{Binding}" />
</DockPanel.ContextMenu>
Run Code Online (Sandbox Code Playgroud)

我为使用以下内容的每个元素得到此(运行时)错误HierarchicalDataTemplate:

System.Windows.Data错误:3:找不到提供DataContext的元素.BindingExpression :(没有路径); 的DataItem = NULL; target元素是'SomeContextMenu'(Name =''); target属性是'DataContext'(类型'Object')

Binding除了上下文菜单之外,为什么s适用于所有内容,而不适用于上下文菜单?

H.B*_*.B. 17

首先,DataContext="{Binding}"没有太大意义,因为它会将DataContext绑定到DataContext.这里的问题可能是ContextMenu不在逻辑树中,并且由于ContextMenus是浮动弹出窗口,因此它的可视树被断开连接.

尝试通过PlacementTarget绑定DataContext:

 DataContext="{Binding PlacementTarget.DataContext,
                       RelativeSource={RelativeSource Self}}"
Run Code Online (Sandbox Code Playgroud)