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

本文关键字:绑定 上下文 菜单 添加 运行时 | 更新日期: 2023-09-27 18:10:31

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

    在xaml中绑定标准列表,然后在运行时添加常用项。或
  1. 将上下文菜单绑定到两个单独的列表或
  2. 还有其他更好的选择吗

请注意,由于一些技术原因,我需要维护两个单独的列表。我没有显示任何现有的代码,因为这个问题可能被认为是一个通用的问题,可能适用于任何控件。

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

第二种选择是可行的,使用CompositeCollection,但是在CollectionContainer.Collection -Binding中绑定能力有点减弱(不能使用DataContext, ElementNameRelativeSource)。

我对另一个问题的回答显示了绑定的两种方式。如果不能满足这些限制,则必须在代码隐藏中创建组合集合。

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

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

像这样:

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

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