web-dev-qa-db-ja.com

ItemsSourceを使用したWPFContextMenu-各アイテムのコマンドにバインドする方法は?

重複の可能性:
DataTemplateでMenuItemのコマンドを指定

メニュー項目を表すオブジェクト(ビューモデル)のコレクションがあります。それぞれに、MenuItemがクリックされたときに実行したいコマンドがあります。

メニューを静的に実行したい場合は、次のようにします。

<ContextMenu>
    <MenuItem Header="{Binding Text1}" Command={Binding Command1}>
    <MenuItem Header="{Binding Text2}" Command={Binding Command2}>
</ContextMenu>

しかし、事前にアイテムがわからない場合(コレクションからのもの)、ContextMenu.ItemsSourceを割り当てて、ItemTemplateにテキストを入力する必要があります。

<ContextMenu ItemsSource="{Binding MyMenuItems}">
    <ContextMenu.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text2}" /> <!-- But where to put Command binding? TextBlock.Command makes no sense, and we have no access to MenuItem! -->
        </DataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

ただし、この方法では、コマンドをバインドする場所がありません。すべての行のMenuItemを取得できないためです。

何かアドバイスをお願いします。君たちありがとう!

21
Tomáš Kafka
<ContextMenu.ItemContainerStyle>
  <Style TargetType="MenuItem">
    <Setter Property="Command" Value="{Binding AssociatedCommand}" />
  </Style>
</ContextMenu.ItemContainerStyle>

ここで、AssociatedCommandは、ICommandを保持するviewmodelオブジェクトのプロパティです。

31
itowlson