1

ContextMenu を設定している TabControl があります。

すべての ContextMenu 要素にはコマンド セットがあります。

<ContextMenu x:Key="tabMenu">
  <MenuItem Command="{x:Static tabs:TabCommands.Close}" />
  <MenuItem Command="{x:Static tabs:TabCommands.CloseAllButThis}" />
  <MenuItem Command="{x:Static tabs:TabCommands.CloseAll}" />
</ContextMenu>

すべてのコマンドがルーティングされ、CommandBindings は TabControl の数レベル上で定義されます。

問題は、CommandBinding の CanExecute/Execute イベント ハンドラーで、どの TabItem でメニューが呼び出されたかを確認する正しい方法はどれかということです。正しいとは、TabItem テンプレートのようなものを変更しても壊れないものを意味します。

または、アプローチ全体が間違っている可能性があり、これにはルーティングされたコマンドを使用しないでください。私は元々、ホットキーを必要とする [新しいタブの追加] コマンドにルーティングを使用していました。

前もって感謝します。

更新

Igor のソリューションはアーキテクチャーの POV よりもきれいですが (ViewModel で _ を削除することを除いて)、TabControl がバインドされているものから独立した再利用可能な Close コマンドが必要です (タブの Close/Close All はあらゆる種類のアプリケーションに存在するため)。特定のモデルに意味的にリンクされていません)。

また、カスタム テンプレートが既にあるため、カスタム DataTemplate を使用できません。それをサブクラス化すると、ソリューションが少し複雑になります。

4

2 に答える 2

1

私は自分で答えを見つけたようですが、それは非常に洗練されていません:

<Style TargetType="MenuItem">
  <Setter Property="CommandTarget">
    <Setter.Value>
      <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}"
               Path="(ContextMenu.PlacementTarget)" />
    </Setter.Value>
  </Setter>
</Style>

<Style TargetType="TabItem">
  <Setter Property="ContextMenu" Value="{StaticResource tabMenu}" />
</Style>

そこで、TabControl の代わりに ContextMenu を TabItem に追加し、CommandTarget を TabItem にバインドします。

より良い答えがあるかどうかは興味深いです。

于 2009-01-18T22:08:59.967 に答える