2012-10-17 92 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