我想使用自定义对象列表在菜单中生成 MenuItems 列表,但在该菜单的底部,我希望始终出现几个静态 MenuItems。从逻辑上讲,在我看来,这可以通过以编程方式创建另一个列表来绑定,该列表总是在底部有那些 MenuItem,但这让我觉得这是一种天真的方法。我确信有一种更优雅的方法可以使用我已经拥有的列表以及一些 XAML 魔法,可能使用某种 DataTemplate。任何指针?
问问题
400 次
2 回答
5
就像 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>
于 2013-07-11T18:31:37.897 回答
2
使用CompositeCollection
带有两个子集合(生成的菜单项和静态的菜单项)的 a 。
编辑应该是这样的:
<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”,必须使用此答案中概述的代理。因此<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}"/>
于 2013-07-11T17:57:23.377 回答