WPF Resources.ContextMenu.MenuItem 绑定到 ContextMenu.PlacementTarget.(AttachedProperty)

WPF Resources.ContextMenu.MenuItem binding to ContextMenu.PlacementTarget.(AttachedProperty)

如果标题没有吓到你,那就...

<UserControl.Resources>
    <!-- so the attached CustomObject can bind to the context -->
    <my:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />

    <!-- for chaining IsNull to Visibility.Collapsed -->
    <my:ConverterGroup x:Key="IsNullToVisibility">
        <my:IsNullConverter />
        <my:VisibilityValuesEqual />
    </my:ConverterGroup>

    <ContextMenu x:Key="ctxmnu">
        <MenuItem Header="Copy"   Click="ctxmnu_itmCopy_Click" />
        <MenuItem Header="Add"    Click="ctxmnu_itmAdd_Click"
                  IsEnabled="{Binding  Source={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu},
                                       Path=PlacementTarget,
                                       Converter={StaticResource IsNotNullConverter}}"
                  Visibility="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu},
                                       Path=PlacementTarget.(myAP:APClass.Property),
                                       Converter={StaticResource IsNullToVisibility}}"
                  />
    </ContextMenu>
</UserControl.Resources>


    <Label Content="{Binding Path=Description}" ContextMenu="{StaticResource ctxmnu}">
        <myAP:APClass.Property>
            <myAP:CustomObject ID="{Binding Source={StaticResource DataContextProxy}, Path=ID}" />
        </myAP:APClass.Property>
    </Label>

</UserControl>

基本上,我有一个上下文菜单,有两个菜单项...第一个(副本)始终可用...第二个(添加)仅在从 UIElement 应用上下文菜单时可用随附 属性.

大部分工作...附加 属性 通过代理资源正确绑定,菜单项单击事件能够获得附加的 属性 值。

唯一不起作用的是 MenuItem。IsEnabled/Visibility 绑定(我最初打算绑定可见性,但最近我认为 IsEnabled 对 UX 来说是一个更好的主意)。

错误在绑定中。输出中的标准错误 40 window.

System.Windows.Data
 Error: 40 :
 BindingExpression path error:
 'PlacementTarget' property not found on 'object' ''RelativeSource' (HashCode=22838427)'.
 BindingExpression:Path=PlacementTarget.(0); DataItem='RelativeSource' (HashCode=22838427);
 target element is 'MenuItem' (Name='');
 target property is 'Visibility' (type 'Visibility')

事实是,我能够找到的每篇文章或示例(关于 MenuItem 绑定到 PlacementTarget)都直接在 UIElement 上具有上下文菜单,并且由于绑定发生在实例化 window/control 时(在显示上下文菜单之前),我认为 PlacementTarget 是 NULL,因此是错误的。

提前致谢!

问题是您正在使用绑定的 Source 属性 分配 RelativeSource。应该是:

IsEnabled="{Binding RelativeSource={RelativeSource
                    ^^^^^^^^^^^^^^

如果您查看错误,它实际上会解释它:

'PlacementTarget' property not found on 'object' ''RelativeSource'

该对象应该是上下文菜单。