2015-11-26 26 views
4

我有一個MenuItem在上下文菜單中,我想使用ItemSource爲列表中的每個項目生成子MenuItems。每個這些生成的項目都應該有子菜單項Active(可選),Edit和Delete。WPF XAML - 帶ItemSource和子菜單項的MenuItem

Custom Messages 
    -Custom Message 1 
      -Active 
      -Edit 
      -Delete 
    -Custom Message 2 
      -Active 
      -Edit 
      -Delete 
    -Custom Message 3 
      -Active 
      -Edit 
      -Delete 

下面的XAML部分作品:

<MenuItem Header="Custom Messages" Visibility="{Binding Path=HasCustomMessages, Converter={StaticResource BVC}}" ItemsSource="{Binding Path=CustomMessages}" DisplayMemberPath="Description"> 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="ItemsSource"> 
       <Setter.Value> 
        <x:Array Type="FrameworkElement"> 
         <MenuItem Header="Active" IsCheckable="True" IsChecked="{Binding Path=Active}"></MenuItem> 
         <Separator></Separator> 
         <MenuItem Header="Edit" Name="EditCustomMessageButton" Click="EditCustomMessageButton_Click" Style="{x:Null}"></MenuItem> 
         <MenuItem Header="Delete" Name="DeleteCustomMessageButton" Click="DeleteCustomMessageButton_Click" Style="{x:Null}"></MenuItem> 
        </x:Array> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </MenuItem.ItemContainerStyle>      
</MenuItem> 
<MenuItem Header="Add Custom Message" Name="AddCustomMessageButtton" Click="AddCustomMessageButtton_Click"></MenuItem> 
<Separator></Separator> 
<MenuItem Header="Delete" Name="DeleteButton" Click="DeleteButton_Click"></MenuItem> 

但是這裏有兩個問題:

  1. 編輯和刪除似乎在recusive的方式來表現,因爲它們都似乎有子菜單,隨後在盤旋時拋出異常: Sub Menu Exception

  2. 通過在Edit和Delete上設置ItemSource =「{x:Null}」解決了上述問題,但事件表現得很直白。單擊刪除不執行任何操作,單擊編輯觸發編輯按鈕單擊事件,然後是刪除按鈕單擊事件,然後單擊添加按鈕單擊事件(甚至不是其他兩個的兄弟)。

+0

是否有可能讓每個包含Click事件的ICommand屬性的menuItem都有一個VM? – tgpdyk

回答

2

的問題是,你設置的所有MenuItem的風格與子菜單,因此其造成這種無限循環一樣 - StackOverflow的:-)問題。 下面一行是錯誤的:

<Style TargetType="MenuItem"> 

因此,你可以創建這種風格在你的資源,並通過其x叫它:重點:

<Style x:Key="SubMenuStyle"> 
    <Setter Property="ItemsSource"> 
     <Setter.Value> 
      <x:Array Type="FrameworkElement"> 
       <MenuItem Header="Active" IsCheckable="True" IsChecked="{Binding Path=Active}"></MenuItem> 
       <Separator></Separator> 
       <MenuItem Header="Edit" Name="EditCustomMessageButton" Click="EditCustomMessageButton_Click" Style="{x:Null}"></MenuItem> 
       <MenuItem Header="Delete" Name="DeleteCustomMessageButton" Click="DeleteCustomMessageButton_Click" Style="{x:Null}"></MenuItem> 
      </x:Array> 
     </Setter.Value> 
    </Setter> 
</Style> 


<MenuItem Header="Custom Messages" ItemsSource="{Binding Path=CustomMessages}" ItemContainerStyle="{StaticResource SubMenuStyle}"...> 
+0

這似乎沒有解釋如何實現生成的菜單項上的子項目。你能澄清嗎?我已經添加了原始問題的圖解釋我想實現的目標 – apc

+0

我認爲您可以將每個CustomMessage的ControlTemplate設置爲ListBox –

+0

我不確定列表框在這裏如何幫助? – apc

0

首先,您已設置ItemsSource屬性兩次在上面的代碼爲ItemsSource="{Binding Path=CustomMessages}"

其次,您正在設置ItemsSource錯誤的方式。它應該是:

<MenuItem ...> 
<MenuItem.ItemsSource> 
<x:Array Type="FrameworkElement"> 
    <MenuItem Header="Active" IsCheckable="True" IsChecked="{Binding Path=Active}"></MenuItem> 
    <Separator></Separator> 
    <MenuItem Header="Edit" Name="EditCustomMessageButton" Style="{x:Null}"></MenuItem> 
    <MenuItem Header="Delete" Name="DeleteCustomMessageButton" Style="{x:Null}"></MenuItem> 
</x:Array> 
</MenuItem.ItemsSource> 
+0

需要爲第一級項目(從模型中的集合生成)設置兩個項目源,然後爲底層級靜態項目(活動,編輯,刪除)設置第二個源項目 – apc

+0

第二個ItemSource位於MenuItem上。 ItemContainerStyle,它是生成的子菜單項的樣式。 – apc

相關問題