2017-01-11 5 views
1

私は、グラフィカルな変更のスイッチとして使用されるUserControl内にボーダーコントロールを持っています。 Borderには、 "Open"と "Close"の2つのMenuItemを持つコンテキストメニューがあります。バインディングの変更後にWPFコンテキストメニューがポップアップする

スイッチが閉じているときは、「開く」メニュー項目だけが表示され、スイッチが開いているときは「閉じる」だけが表示されます。一部のスイッチでは、OpenまたはCloseを完全に無効にする必要があるため、いつでも表示させたくありません。ここでは、コードは次のようになります。

<Border.ContextMenu> 
    <ContextMenu Name="switchContextMenu"> 
     <ContextMenu.Visibility> 
      <MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}"> 
       <Binding Path="OpenAvailable" /> 
       <Binding Path="OpenVisible" /> 
       <Binding Path="CloseAvailable" /> 
       <Binding Path="CloseVisible" /> 
      </MultiBinding> 
     </ContextMenu.Visibility> 
     <MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }" 
        Click="miOpen_Click"> 
      <MenuItem.Visibility> 
       <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}"> 
        <Binding Path="OpenAvailable" /> 
        <Binding Path="OpenVisible" /> 
       </MultiBinding> 
      </MenuItem.Visibility> 
     </MenuItem> 
     <MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }" 
        Click="miClose_Click"> 
      <MenuItem.Visibility> 
       <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}"> 
        <Binding Path="CloseAvailable" /> 
        <Binding Path="CloseVisible" /> 
       </MultiBinding> 
      </MenuItem.Visibility> 
     </MenuItem> 
    </ContextMenu> 
</Border.ContextMenu> 

私は、「利用可能なオープン」とプロパティ「利用可能なを閉じて」設定別の.xamlコード内部ので、私は、一般的な構成要素として、このスイッチを使用します。ここに私の問題があります:

私はスイッチがあります。デフォルトでは、このスイッチは開いています。私はそれを閉じ、それはOKです。このスイッチを右クリックすると、コンテキストメニューが表示されなくなります。これもOKです。

問題は、このスイッチが再び開き、いくつかの値を変更したときに、その時点でコンテキストメニューがポップアップすることです。 ContextMenuの可視性のためのコンバータに問題があると私は思う。この時点でトリガされ、ContextMenuが表示されます。

誰でもこの動作を停止する方法がありますか?代わりにContextMenu可視性を設定するので

答えて

0

することは、あなたはBorder

<Border> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Setter Property="ContextMenu"> 
       <Setter.Value> 
        <ContextMenu Name="switchContextMenu"> 
         <MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }" 
          Click="miOpen_Click"> 
          <MenuItem.Visibility> 
           <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}"> 
            <Binding Path="OpenAvailable" /> 
            <Binding Path="OpenVisible" /> 
           </MultiBinding> 
          </MenuItem.Visibility> 
         </MenuItem> 
         <MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }" 
          Click="miClose_Click"> 
          <MenuItem.Visibility> 
           <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}"> 
            <Binding Path="CloseAvailable" /> 
            <Binding Path="CloseVisible" /> 
           </MultiBinding> 
          </MenuItem.Visibility> 
         </MenuItem> 
        </ContextMenu> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <DataTrigger Value="False"> 
        <DataTrigger.Binding> 
         <MultiBinding Converter="{StaticResource ContextMenuBoolAggregate}"> 
          <Binding Path="OpenAvailable" /> 
          <Binding Path="OpenVisible" /> 
          <Binding Path="CloseAvailable" /> 
          <Binding Path="CloseVisible" /> 
         </MultiBinding> 
        </DataTrigger.Binding> 
        <Setter Property="ContextMenu" Value="{x:Null}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
</Border> 

のスタイルを設定することができますので、トリガーは、条件付きでContextMenuを削除する代わりに、その可視性を変更しています。 ContextMenuBoolAggregateコンバーター名を使用して、コンテキストメニューを削除する正しい値を決定する新しいコンバータを作成する必要があることを示しました。その部分を実装する方法は明らかです。あなたの条件は十分に簡単である場合

、あなたはMultiBindingConverterMultiDataTriggerの代わりDataTriggerを使用することができます。

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding OpenAvailable}" Value="False"/> 
     <Condition Binding="{Binding OpenVisible}" Value="False"/> 
     <Condition Binding="{Binding CloseAvailable}" Value="False"/> 
     <Condition Binding="{Binding CloseVisible}" Value="False"/> 
    </MultiDataTrigger.Conditions> 
    <Setter Property="ContextMenu" Value="{x:Null}"/> 
</MultiDataTrigger> 
0

は、私は別の方法で解決策を見つけました。私はContextMenuService.IsEnabledプロパティを使用しました。 whenをfalseに設定すると、コンテキストメニューを表示できません。だから、私は私のBorder.xamlコードでこれを追加しました:

<ContextMenuService.IsEnabled> 
    <MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}"> 
     <Binding Path="OpenAvailable" ElementName="mySwitch" /> 
     <Binding Path="OpenVisible" ElementName="mySwitch" /> 
     <Binding Path="CloseAvailable" ElementName="mySwitch" /> 
     <Binding Path="CloseVisible" ElementName="mySwitch" /> 
    </MultiBinding> 
</ContextMenuService.IsEnabled> 

私はまた私のContextMenuBoolToVisibilityコンバータを変えました。 Visibility.VisibleまたはVisibility.Collapsedを返す代わりに、ContextMenuService.IsEnabledプロパティの場合はtrueまたはfalseを返します。

関連する問題