首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏菜单项时出现绑定错误

隐藏菜单项时出现绑定错误
EN

Stack Overflow用户
提问于 2012-10-17 22:47:30
回答 1查看 556关注 0票数 0

我想隐藏一个关于用户权限的menuItem。菜单项被放置在上下文菜单(通过右键单击显示)中的userControl中。权限通过主窗口传递给用户控件。我有一个错误40 :绑定错误。VS找不到我在xaml文档中声明的属性。

MainWindow.xaml

代码语言:javascript
复制
<MyUC:myUC
    ...
    MainOptionsVisibility="False" />

myUc.xaml

代码语言:javascript
复制
<GMap_NET_WindowsPresentation:GMapControl.ContextMenu>
                <ContextMenu Opened="ContextMenu_Opened">
                    <MenuItem
                        Header="{x:Static Internationalization:Resources.VIEWPORT_ADDOBJECT}"
                        Command="{x:Static local:Viewport.CreateGraphicObjectRequestCommand}"
                        CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
                        Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}">
                        <MenuItem.Icon>
                            <Image Source="{DynamicResource EditIcon}" Width="32" Height="32" />
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="{x:Static Internationalization:Resources.OPTIONS}"
                             Visibility="{Binding Path=MainOptionsVisibility, RelativeSource={RelativeSource Self}, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" >
                             ...
                     />
            </GMap_NET_WindowsPresentation:GMapControl.ContextMenu>
        </GMap_NET_WindowsPresentation:GMapControl>

并且MainOptionsVisibility在代码隐藏中被很好地声明为依赖属性。另一项的可见性是正常的(我没有这样做)。

编辑:在Flo的答案之后添加新的XAML代码:

代码语言:javascript
复制
<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:Main.Client.MyProject.Implementation.UIs.StandardViewports.Viewports"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:GMap_NET_WindowsPresentation="clr-namespace:GMap.NET.WindowsPresentation;assembly=GMap.NET.WindowsPresentation"
         xmlns:Internationalization="clr-namespace:Main.Client.MyProject.Library.Resources;assembly=MyProjectLibrary"
         xmlns:Main_Client_MyProject_Library_Converters="clr-namespace:Main.Client.MyProject.Library.Converters;assembly=MyProjectLibrary"
         x:Name="baseViewport"
         x:Class="Main.Client.MyProject.Implementation.UIs.StandardViewports.Viewports.Viewport"
         MouseEnter="baseViewport_MouseEnter"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300" Loaded="BaseViewport_Loaded">
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyLibs;component/ResourceDictionnary/ResourceDictionnary.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <Main_Client_MyProject_Library_Converters:BooleanToVisibilityCollapsedConverter x:Key="BooleanToVisibilityCollapsedConverter" />
        <Main_Client_MyProject_Library_Converters:BooleanToVisibilityCollapsedConverter x:Key="BooleanToVisibilityTestConverter" />
    </ResourceDictionary>
</UserControl.Resources>
<UserControl.CommandBindings>
    ...
</UserControl.CommandBindings>
<Grid>
    <GMap_NET_WindowsPresentation:GMapControl
        x:Name="gMapControl"
        MaxZoom="18"
        MinZoom="1"
        MouseDown="gMapControl_MouseDown"
        OnMapZoomChanged="gMapControl_OnMapZoomChanged"
        OnCurrentPositionChanged="gMapControl_OnCurrentPositionChanged"
        MouseMove="gMapControl_MouseMove"
        Loaded="gMapControl_Loaded"
        Drop="gMapControl_Drop"
        AllowDrop="True"
        IsEnabled="{Binding IsEnabled, ElementName=baseViewport}" MapType="OpenStreetMap">
        <GMap_NET_WindowsPresentation:GMapControl.ContextMenu>
            <ContextMenu Opened="ContextMenu_Opened">
                <MenuItem
                    Header="{x:Static Internationalization:Resources.VIEWPORT_ADDOBJECT}"
                    Command="{x:Static local:Viewport.CreateGraphicObjectRequestCommand}"
                    CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
                    Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BooleanToVisibilityTestConverter}}">
                    <MenuItem.Icon>
                        <Image Source="{DynamicResource EditIcon}" Width="32" Height="32" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="{x:Static Internationalization:Resources.VIEWPORT_OPTIONS}"
                         Visibility="{Binding Path=PlacementTarget.DataContext.MainOptionsVisibility, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Converter={StaticResource BooleanToVisibilityTestConverter}}" >
                    <MenuItem Header="{x:Static Internationalization:Resources.VIEWPORT_LOCKSUPERIORLEFTCORNER}" Command="{x:Static local:Viewport.LockSuperiorLeftCornerRequestCommand}" CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">

                    </MenuItem>
                    <MenuItem Header="{x:Static Internationalization:Resources.VIEWPORT_LOCKINFERIORRIGHTCORNER}" Command="{x:Static local:Viewport.LockInferiorRightCornerRequestCommand}" CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">

                    </MenuItem>
                    <MenuItem Header="{x:Static Internationalization:Resources.VIEWPORT_LOCKZOOMMAXONMAP}" Command="{x:Static local:Viewport.LockMaxZoomLevelRequestCommand}" CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" >
                    </MenuItem>
                    <MenuItem Header="{x:Static Internationalization:Resources.VIEWPORT_LOCKZOOMMINONMAP}" Command="{x:Static local:Viewport.LockMinZoomLevelRequestCommand}" CommandTarget="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" >
                    </MenuItem>
                </MenuItem>

            </ContextMenu>
        </GMap_NET_WindowsPresentation:GMapControl.ContextMenu>
    </GMap_NET_WindowsPresentation:GMapControl>
</Grid>

两个menuItems的转换器都已更改以进行测试。它永远不会被调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 14:34:16

问题是你的MenuItem没有叫做MainOptionsVisibility的属性,只有你的窗口有。通过RelativeSource={RelativeSource Self}绑定到MenuItem。

RelativeSource={RelativeSource AncestorType={x:Type Window}}也不能工作,因为你的ContextMenu不是逻辑树或可视化树的一部分。

您可以做的是将窗口的ContextMenus PlacementTarget (GMap_NET_WindowsPresentation:GMapControl)的DataContext或其祖先之一设置为您的窗口(例如,通过将Windows DataContext设置为自身(<Window ...DataContext={Binding RelativeSource={RelativeSource Self}}.../>),并执行以下操作:

代码语言:javascript
复制
<MenuItem Header="{x:Static Internationalization:Resources.OPTIONS}" Visibility="{Binding Path=PlacementTarget.DataContext.MainOptionsVisibility, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" >
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12937020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档