我希望使用自定义对象的列表在菜单中生成MenuItems
的列表,但是在该菜单的底部,我想始终显示一些静态MenuItems
。在我的逻辑中,可以通过编程方式创建另一个列表来绑定那些总是出现在底部的MenuItems
,但是这使我觉得这种方法有点天真。我确定有更优雅的方法,可以使用我已经拥有的列表以及一些XAML技巧来做到这一点,可能需要使用某种类型的DataTemplate
。有什么指针吗?
我希望使用自定义对象的列表在菜单中生成MenuItems
的列表,但是在该菜单的底部,我想始终显示一些静态MenuItems
。在我的逻辑中,可以通过编程方式创建另一个列表来绑定那些总是出现在底部的MenuItems
,但是这使我觉得这种方法有点天真。我确定有更优雅的方法,可以使用我已经拥有的列表以及一些XAML技巧来做到这一点,可能需要使用某种类型的DataTemplate
。有什么指针吗?
像 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>
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>
{
}
<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}"/>