通过绑定部分填充MenuItem

时间:2013-07-11 17:18:26

标签: c# wpf xaml data-binding

我想使用自定义对象列表在菜单中生成MenuItems列表,但是在该菜单的底部我想要总是出现几个静态MenuItem。逻辑上在我的脑海中,这可以通过以编程方式创建另一个要绑定的列表来完成,它总是在底部有那些MenuItems,但这让我觉得这是一种接近这个的天真方式。我确信有一个更优雅的方法可以使用我已经拥有的列表以及一些XAML魔法,可能还有一些DataTemplate。有什么指针吗?

2 个答案:

答案 0 :(得分:4)

就像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>

答案 1 :(得分: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}"/>