2013-07-11 33 views
1

我想使用自定义对象的列表来生成菜单中的MenuItems列表,但是在该菜单的底部,我想要几个静态MenuItem始终显示。从逻辑上讲,这可以通过编程创建另一个绑定列表来完成,该列表总是在底部有这些MenuItems,但这让我觉得这是一种天真的方式来处理这个问题。我确信有一个更好的方法可以用我已经有的一些XAML巫术的列表来完成它,可能带有某种DataTemplate。任何指针?通过绑定部分填充MenuItem

+0

不错的问题!我的直觉就是将两者无缝融合,以便为单一菜单提供视觉体验,并在Xaml中完成整个事情。我和你一样,如果有任何方法可以避免代码,并且在这种情况下。我会很感兴趣地看到答案! –

+0

将MenuItems绑定到ObservableCollection 是否适合您?通过在linq查询中使用OrderBy方法进行排序,您可以在列表底部提供静态对象。不知道这是你在找什么... – Killingsworth

+0

还是你只是谈论结合和整理两个集合? – Killingsworth

回答

3

像McGarnagle说,你可以使用一个CompositeCollection。但是,您不需要为固定菜单项创建资源。您可以将它们直接放置在CompositeCollection中,如下所示:

<Menu> 
    <Menu.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Path=MyItems}" /> 
      <Separator/> 
      <MenuItem Header="Fixed item 1" /> 
      <MenuItem Header="Fixed item 2" /> 
     </CompositeCollection> 
    </Menu.ItemsSource> 
</Menu> 
+0

简单,简洁,直接。我喜欢。 – Abion47

+1

从来没有人指责我简洁,+1 – McGarnagle

2

使用带有两个子集合(生成的菜单项和静态项)的CompositeCollection

编辑应该是这个样子:

<Button Content="Test"> 
    <Button.Resources> 
     <viewModel:MenuItemCollection x:Key="FixedMenuItems"> 
      <MenuItem Header="Fixed Item" /> 
     </viewModel:MenuItemCollection> 
    </Button.Resources> 

    <Button.ContextMenu> 
     <ContextMenu> 
      <ContextMenu.ItemsSource> 
       <CompositeCollection> 
        <CollectionContainer Collection="{StaticResource FixedMenuItems}" /> 
        <CollectionContainer Collection="{Binding MyMenuItems}" /> 
       </CompositeCollection> 
      </ContextMenu.ItemsSource> 
     </ContextMenu> 
    </Button.ContextMenu> 

</Button> 

哪里viewModel:MenuItemCollection只是一个MenuItem列表:

public class MenuItemCollection : ObservableCollection<MenuItem> 
{ 
} 

第二个编辑需要对这个

一个补丁修复。要绑定到视图模型中的“MyMenuItems”,有必要使用this answer中概述的代理。因此,而不是<CollectionContainer Collection="{Binding MyMenuItems}" />,你会最终使用:

<CollectionContainer Collection="{Binding Path=DataContext.MyMenuItems,Source={StaticResource ProxyElement}}" /> 

并添加代理到视图的顶部:

<UserControl.Resources> 
    <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/> 
<UserControl.Resources> 
<ContentControl Visibility="Collapsed" Content="{StaticResource ProxyElement}"/> 
+1

值得注意的是,代理代码的唯一原因是ContextMenu,它不是可视化树的一部分。标准的菜单控件不会有这个问题。 –