2010-06-11 87 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