メニュー項目を表すオブジェクト(ビューモデル)のコレクションがあります。それぞれに、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を取得できないためです。
何かアドバイスをお願いします。君たちありがとう!
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding AssociatedCommand}" />
</Style>
</ContextMenu.ItemContainerStyle>
ここで、AssociatedCommandは、ICommandを保持するviewmodelオブジェクトのプロパティです。