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'
该对象应该是上下文菜单。
如果标题没有吓到你,那就...
<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'
该对象应该是上下文菜单。