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

时间:2011-08-02 15:52:20

标签: c# .net wpf xaml data-binding

我的代码看起来像这样:

<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错误:3:找不到提供DataContext的元素。 BindingExpression :(没有路径);的DataItem = NULL; target元素是'SomeContextMenu'(Name =''); target属性是'DataContext'(类型'Object')

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

1 个答案:

答案 0 :(得分:17)

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

尝试通过PlacementTarget绑定DataContext:

 DataContext="{Binding PlacementTarget.DataContext,
                       RelativeSource={RelativeSource Self}}"