2010-06-11 73 views
3

我想避免必須在XAML或代碼手工創建一個菜單,通過結合到ICommand衍生的對象的列表。但是,我遇到了一下,其中出現的菜單中有菜單項目兩個層面的問題(即每個MenuItem包含在MenuItem):麻煩WPF菜單結合的ItemsSource

alt text http://i47.tinypic.com/j63lg2.png

我的猜測是,這是因爲發生WPF自動生成我結合MenuItem,但「瀏覽器」我使用其實已經一個MenuItem(它是從MenuItem派生):

<ContextMenu 
    x:Name="selectionContextMenu" 
    ItemsSource="{Binding Source={x:Static OrangeNote:Note.MultiCommands}}" 
    ItemContainerStyleSelector="{StaticResource separatorStyleSelector}"> 
    <ContextMenu.ItemTemplate> 
     <DataTemplate> 
      <Viewers:NoteCommandMenuItemViewer 
       CommandParameter="{Binding Source={x:Static OrangeNote:App.Screen}, Path=SelectedNotes}" /> 
     </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

(該ItemContainerStyleSelector是http://bea.stollnitz.com/blog/?p=23,這讓我有我的綁定源裏面Separator元素。)

所以,菜單必然的ICommand個集合,每個項目的CommandParameter被設置爲相同的全球目標(這恰好是一個集合,但那不重要)。

我的問題是,有沒有我可以綁定這使得WPF不會自動在MenuItem包裝每個項目什麼辦法?

回答

2

我會傾向於繼承文本菜單和覆蓋GetContainerForItemOverride:

public class ContextMenuWithNoteCommands : ContextMenu 
{ 
    protected virtual DependencyObject GetContainerForItemOverride() 
    { 
    return new NoteCommandMenuItemViewer(); 
    } 
} 

然後設置CommandParameter在NoteCommandMenuItemViewer風格結合,或ContextMenu.ItemContainerStyle,無論是比較合適的。

這假設你不能簡單地用在常規菜單項ItemContainerStyle得到你想要的效果:嗯,這真的就是我NoteCommandMenuItemViewer類是做反正

<ContextMenu ...> 
    <ContextMenu.ItemContainerStyle> 
    <Style> 
     ... 
    </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 
+0

謝謝,這是一個更簡單的解決方案! – devios1 2010-06-12 14:07:34

3

不幸的是,我已經找到解決這個問題的最佳方法是使用一個樣式爲的MenuItems,而不是一個ItemTemplate。然後,樣式中的每個屬性都可以綁定到對象上的屬性。像這樣的事情,例如:

<Style x:Key="SelectionContextMenuStyle" TargetType="MenuItem"> 
    <Setter Property="Header" Value="{Binding Path=Text}" /> 
    <Setter Property="Command" Value="{Binding Path=Command}" /> 
    <Setter Property="CommandParameter" Value="{Binding Path=Parameter}" /> 
</Style> 

這真的好像一個ItemTemplate應該工作,這將是更好的路要走,但是這是我發現,實際工作正常的唯一方法。

+0

,所以我想這不是一個可怕的損失這樣做。 – devios1 2010-06-11 17:04:46