【问题标题】:Why can't I use DataContext={Binding} for my context menu?为什么我的上下文菜单不能使用 DataContext={Binding}?
【发布时间】:2011-10-18 09:30:30
【问题描述】:

我的代码看起来像这样:

<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:(无路径);数据项=空;目标元素是 'SomeContextMenu' (Name='');目标属性是“DataContext”(类型“对象”)

为什么Bindings 对上下文菜单以外的所有内容都有效,但对上下文菜单无效?

【问题讨论】:

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


    【解决方案1】:

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

    尝试通过 PlacementTarget 绑定 DataContext:

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

    【讨论】:

    • 啊,有道理。我最终通过内联上下文菜单解决了这个问题,因为它只有一个 MenuItem 并且只在一个地方使用,但你的解决方案也有效。
    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多