在运行时将项添加到数据绑定上下文菜单

时间:2011-10-03 16:01:30

标签: c# wpf data-binding .net-4.0 contextmenu

我需要在上下文菜单中显示项目列表。除此之外,我需要在顶部显示常用项目(可由用户配置),然后是分隔符,然后是所有项目的标准列表。我知道,我可以在运行时将所有项目添加到上下文菜单中,但我也想探索不同的选项。问题是 - 是否有可能:

  1. 在xaml中绑定标准列表,然后在运行时添加常用项。 OR
  2. 将上下文菜单绑定到两个单独的列表 OR
  3. 任何其他更好的选择
  4. 请注意,由于某些技术原因,我需要保留两个单独的列表。 我没有显示任何现有代码,因为此问题可能被视为一般性问题,可能适用于任何控制。

2 个答案:

答案 0 :(得分:0)

第二个选项可以使用CompositeCollection,但绑定功能有点暗淡(不能使用DataContextElementNameRelativeSource){{3 }} - 结合

我在另一个问题上的CollectionContainer.Collection显示了两种可以绑定的方式。如果您无法处理这些限制,则必须在代码隐藏中创建复合集合。

答案 1 :(得分:0)

我会在ViewModel中管理我的菜单,而不是在XAML中。我的ViewModel将负责返回一个集合了标准Menu集合和自定义UserCollection的集合。

通常我使用null值分隔项目,如果项目为空,则使用DataTrigger将模板绘制为分隔符。

这样的事情:

myMenu.AddRange(UserMenu);
myMenu.Add(null);
myMenu.AddRange(StandardMenu);

和XAML ......

<ContextMenu ItemsSource="{Binding MyMenu}">
    <ContextMenu.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Template" 
                    Value="{StaticResource MyMenuItemTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding }" Value="{x:Null}">
                    <Setter Property="Template" 
                            Value="{StaticResource MySeparatorTemplate}" />
                </DataTrigger>
            </Style.Resources>
        </Style>
    </ContextMenu.Resources>
</ContextMenu>