【发布时间】:2016-11-26 19:34:13
【问题描述】:
如果标题没有吓到你,那就来吧……
<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。
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 上具有上下文菜单,并且由于绑定发生在实例化窗口/控件时(在上下文菜单之前显示),我认为 PlacementTarget 为 NULL 并因此出错。
提前谢谢!
【问题讨论】:
标签: wpf binding contextmenu menuitem resourcedictionary