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は、分離コードで依存関係プロパティとして適切に宣言されています。確認しましたが、十分に初期化されています。他のアイテムの視認性はOKです(私はやっていない)。

編集: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>

テスト用の両方のmenuItemのコンバーターが変更されました。呼び出されることはありません。

4

1 に答える 1

1

問題は、MenuItemに呼び出されるプロパティがMainOptionsVisibilityなく、Windowだけにあることです。RelativeSource={RelativeSource Self}MenuItemへのバインドを介して。

RelativeSource={RelativeSource AncestorType={x:Type Window}}ContextMenuはWindowsの論理ツリーまたはビジュアルツリーの一部ではないため、どちらも機能しません。

できることは、ContextMenus PlacementTarget(GMap_NET_WindowsPresentation:GMapControl)のDataContextまたはその祖先の1つをウィンドウに設定することです(たとえば、Windows DataContextをそれ自体(<Window ...DataContext={Binding RelativeSource={RelativeSource Self}}.../>)に設定し、次のようなことを行います。

<MenuItem Header="{x:Static Internationalization:Resources.OPTIONS}" Visibility="{Binding Path=PlacementTarget.DataContext.MainOptionsVisibility, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" >
于 2012-10-18T06:34:15.750 に答える