WPF ContextMenu:MenuItem 图标可见性绑定错误

Posted

技术标签:

【中文标题】WPF ContextMenu:MenuItem 图标可见性绑定错误【英文标题】:WPF ContextMenu: MenuItem Icon visibility binding error 【发布时间】:2017-07-23 15:54:14 【问题描述】:

这是我的 ContextMenu 的样式:

<Style x:Key="Diostyle" TargetType="ContentControl">
        <Setter Property="Tag" Value="Binding Content,RelativeSource=RelativeSource Mode=Self"/>
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Style="StaticResource DeleteMenuItemStyle"/>
                    <!--<MenuItem Header="Normality">
                        <MenuItem Style="StaticResource NcMenuItemStyle"/>
                        <MenuItem Style="StaticResource NaMenuItemStyle"/>
                    </MenuItem>-->
                    <MenuItem Style="StaticResource BothContactsMenuItemStyle"/>
                </ContextMenu>
            </Setter.Value>
        </Setter>
...

这是我的 MenuItem 的样式:

<Style x:Key="BothContactsMenuItemStyle" TargetType="MenuItem">
        <Setter Property="Header" Value="Both Contacts"/>
        <Setter Property="Command" Value="Binding PlacementTarget.Tag.BothNaNcChangeCommand,RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu"/>
        <Setter Property="Icon">
            <Setter.Value>
                <Image Style="StaticResource Tick16Style" Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu, Converter=StaticResource BoolToVis"/>
            </Setter.Value>
        </Setter>
    </Style>

命令绑定正在工作,而不是图标可见性绑定给我这个错误:

System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ContextMenu',AncestorLevel='1''。 BindingExpression:Path=PlacementTarget.Tag.BothNaNc;数据项=空; 目标元素是'图像'(名称='');目标属性是“可见性” (类型“可见性”)

为什么? 请注意,这是有效的:

<MenuItem Header="TEST" Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu, Converter=StaticResource BoolToVis"/>

【问题讨论】:

【参考方案1】:

您可以将Image 元素定义为资源。这应该有效:

<Image x:Key="img" x:Shared="False"
               Style="StaticResource Tick16Style"
               Visibility="Binding PlacementTarget.Tag.BothNaNc, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu,
                            Converter=StaticResource BoolToVis"/>

<Style x:Key="BothContactsMenuItemStyle" TargetType="MenuItem">
    <Setter Property="Header" Value="Both Contacts"/>
    <Setter Property="Command" Value="Binding PlacementTarget.Tag.BothNaNcChangeCommand, RelativeSource=RelativeSource Mode=FindAncestor,AncestorType=ContextMenu"/>
    <Setter Property="Icon" Value="StaticResource img" />
</Style>

如果您将Icon 属性设置为您在&lt;Setter.Value&gt; 中定义内联的Image 元素,就像您目前所做的那样,它将从父WindowUserControl 或任何地方继承DataContext Style 已定义。

【讨论】:

以上是关于WPF ContextMenu:MenuItem 图标可见性绑定错误的主要内容,如果未能解决你的问题,请参考以下文章

WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性

[WPF]MenuItem右侧空白

求助高手,WPF ContextMenu MenuItem的icon设置成透明,或者去掉icon

WPF-MenuItem只显示最后一个Icon

带有图像的 WPF 菜单项

WPF:从 DataGrid 复制