2012-10-17 93 views
0

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

MainWindow.xaml

<MyUC:myUC 
    ... 
    MainOptionsVisibility="False" /> 

myUc.xaml

<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代码:

<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> 

转换器改为两个的菜单项进行测试。它从来没有被称为。

回答

1

问题是您的MenuItem没有名为MainOptionsVisibility的属性,只有您的Window有。通过RelativeSource={RelativeSource Self}您绑定到MenuItem。

RelativeSource={RelativeSource AncestorType={x:Type Window}}也无法正常工作,因为您的ContextMenu不是Windows逻辑或可视化树的一部分。

你可以做的是通过Windows的DataContext设置到其自身(<Window ...DataContext={Binding RelativeSource={RelativeSource Self}}.../>)和做类似设置什么ContextMenus PlacementTarget的DataContext的(GMap_NET_WindowsPresentation:GMapControl)或其祖先之一的窗口(如:

<MenuItem Header="{x:Static Internationalization:Resources.OPTIONS}" Visibility="{Binding Path=PlacementTarget.DataContext.MainOptionsVisibility, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" > 
+0

谢谢!它解决了绑定错误。无论如何它还没有工作。我检查和转换器从来没有被调用。 – Sheamus

+0

你可以显示你的新的xaml代码(整个xaml)吗? –

+0

你会看到它在编辑;) – Sheamus