WPF:以编程方式将ContextMenu添加到DataGrid列标题

时间:2015-06-19 20:33:52

标签: c# .net wpf datagrid wpfdatagrid

我正在尝试为项目中的每个列标题添加个性化和单独的ContextMenus,以便当用户右键单击标题时,会出现与该标题相关的复选框菜单,允许他们过滤数据。

有几个问题:我正在开发的项目需要为.NET 4.0开发,因此我无法访问引入的DataGridColumnHeader类。 .NET 4.5。此外,所有这些都需要以编程方式完成,不允许XML,因为所有列数据都是在运行时确定的。

我找到了一个使用XML完成的similar Stack question,并且我已经成功地用XML格式复制了它,但我是WPF的新手并且还没有能够重现以编程方式。

我已经在下面粘贴了一些C#代码,我认为应该进行设置。

    /// <summary>
    /// Function that adds all of the columns for the default setup
    /// </summary>
    public void MakeAllColumns()
    {
        for (int i = 0; i < AllColumnDisplayNames.Length; i++)
        {
            DataGridTextColumn col = new DataGridTextColumn();
            col.Header = AllColumnDisplayNames[i];
            col.Binding = new Binding(AllColumnBindings[i]);
            canGrid.Columns.Add(col);

            // code for addding context menus will most likely go here


        }
    }

1 个答案:

答案 0 :(得分:0)

DataGridColumns不是FrameworkElements,因此它们没有ContextMenu。既然你想要在代码中为代码指定一个数据模板,那么所有这一切都很痛苦(恕我直言)。您可以尝试传入FrameworkElement作为列的Header对象,并在该框架元素上设置上下文菜单。

示例:

//...

    DataGridTextColumn col = new DataGridTextColumn();

    //...

    TextBlock txt = new TextBlock() { Text = AllColumnDisplayNames[i] };
    txt.ContextMenu = new ContextMenu(); // Build your context menu here.

    col.Header = txt;

    //...