2013-09-03 15 views
5

xamlでコンテキストメニューが「ハードコード」されている場合、サブメニューを追加するのは簡単です。例えば:コンテキストメニューのWPFサブメニュー

<ContextMenu> 
    <MenuItem Header="Comm1" Command="{Binding Blabla1}"> 
     <MenuItem Header="SubComm1" Command="{Binding Blabla2}"></MenuItem> 
    </MenuItem> 
    <MenuItem Command="Comm2"></MenuItem> 
    <MenuItem Command="Comm3"></MenuItem> 
</ContextMenu> 

これはのContextMenuは、三つの要素(COMM1、COMM2とCOMM3)を有し、COMM1サブメニューSubComm1を有することを意味します。

私はもう少し柔軟な私のContextMenuをした:

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter> 
      <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

基本的に私はのContextMenuにおける任意の数の要素を持つことができ、かつ任意の要素は、任意のコマンドを持つことができます。 ContextMenu要素にサブメニューを追加するにはどうしたらいいですか?

+0

ツリーデータ構造をItemsSourceにバインドし、データをMenuItemsに変換するConverterを使用します。 –

答えて

10

ネストされたコレクションにMenuItem.ItemsSourceを設定できます。これにより、任意のメニュー項目のサブメニューが生成されます。このために、あなたのMenuItemをバックアップモデルがそれに

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="ItemsSource" Value="{Binding ContextMenuSubItems}"></Setter> 
      <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter> 
      <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 

をsubmenuitemsコレクションを持っている必要があります。同様に、あなたのsubmenuitemsのスタイルをMenuItem.ItemContainerStyleMenuItem.ItemTemplateを設定することができます。

関連する問題