在创建菜单项的同时在运行时创建选项卡

时间:2015-07-17 20:02:02

标签: c# wpf xaml drop-down-menu

我正在尝试向菜单项添加另一个标签,我现在同时创建。在我的xaml中,“项目”菜单项的扩展选项卡将是“删除”。继承人喜欢它的方式:

| Projects | > | Project1 |
------------   -----------
               | Project2 | > | Delete |
               ------------   ----------

下面的代码功能正常,但我无法弄清楚如何在每个项目中添加删除选项卡。

在运行时我创建一个这样的菜单项:

foreach (ViewModels.FloorAssignment_VM ap in projectList)
{
    MenuItem pmi = new MenuItem();
    string projectName = ap.Project_Name;
    projectName = projectName.Replace('_', ' ');
    pmi.Header = projectName;
    pmi.Tag = ap.ProjectKey;
    pmi.Click += new RoutedEventHandler(pmi_Click);
    pmi.Style = (Style)this.FindResource("MenuItemStyleBlue");
    ProjectsMenuItem.Items.Add(pmi);

}

和我的xaml

<Grid.ContextMenu>
        <ContextMenu Name="GroupContextMenu" Opened="GroupContextMenu_Opened" Style="{DynamicResource ContextMenuStyleBlue}">
            <MenuItem Name="ProjectsMenuItem" Header="Projects">
                <MenuItem Name="ProjectDeletionMenuItem" Header="Delete"/>
            </MenuItem>
            <MenuItem Name="PropertiesMenuItem" Header="Properties" Click="Properties_Click" />
            <MenuItem Name="ConflictsMenuItem" Header="Conflicts"  />
        </ContextMenu>
</Grid.ContextMenu>

2 个答案:

答案 0 :(得分:2)

您不应该手动创建MenuItem对象。如果您使用数据绑定和HierarchialDataTemplate,您可以毫不客气地添加/删除项目,UI将自动更新(假设您正在使用可观察的集合,例如ObservableCollection。

您的ObservableCollection显然不应包含MenuItems,而是您自己的类,它定义了您需要的属性。从您的示例中,我会说这个类应该只包含一个字符串标签和一个对象项目键。剩下的东西应该是通过MenuItem模板中的数据绑定。

答案 1 :(得分:-1)

据我所知,你想要subMenu&#34; Project&#34;中的每个MenuItem。拥有&#34;删除&#34;拥有它自己的子菜单item,结果有xaml那样:

<Grid.ContextMenu>
    <ContextMenu Name="GroupContextMenu" Opened="GroupContextMenu_Opened" Style="{DynamicResource ContextMenuStyleBlue}">
        <MenuItem Name="ProjectsMenuItem" Header="Projects">
            <MenuItem Header="Project 1" Tag="1" Click="pmi_Click">
                 <MenuItem Header="Delete" Tag="1" Click="del_Click"/>
            </MenuItem>
            <MenuItem Header="Project 2" Tag="2" Click="pmi_Click">
                 <MenuItem Header="Delete" Tag="2" Click="del_Click"/>
            </MenuItem>                
        </MenuItem>
        <MenuItem Name="PropertiesMenuItem" Header="Properties" Click="Properties_Click" />
        <MenuItem Name="ConflictsMenuItem" Header="Conflicts"  />
    </ContextMenu>
</Grid.ContextMenu>

要通过代码实现这一点,您可以像这样更改您的生成器:

foreach (ViewModels.FloorAssignment_VM ap in projectList)
{
    MenuItem pmi = new MenuItem();
    string projectName = ap.Project_Name;
    projectName = projectName.Replace('_', ' ');
    pmi.Header = projectName;
    pmi.Tag = ap.ProjectKey;
    pmi.Click += new RoutedEventHandler(pmi_Click);
    pmi.Style = (Style)this.FindResource("MenuItemStyleBlue");
    MenuItem del = new MenuItem();
    del.Header = "Delete";
    del.Tag = ap.ProjectKey;
    del.Click += new RoutedEventHandler(del_Click);
    pmi.Items.Add(del);
    ProjectsMenuItem.Items.Add(pmi);
}

但是,如果您不需要对菜单进行任何微调(例如,自定义放置的分隔符),您还应该查看HierarchicalDataTemplate以通过绑定到ViewModel来创建所需的菜单。
此外,FindResource - 是StaticResource扩展的代码版本,如果你想获得DynamicResource,你应该这样做:

pmi.SetResourceReference(MenuItem.StyleProperty, "MenuItemStyleBlue");