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

WPF: Programatically adding a ContextMenu to a DataGrid column header

我正在尝试向项目中的每一列 header 添加个性化和独立的上下文菜单,这样当用户 right-clicks 一个 header 时,相关的复选框菜单header 将出现,允许他们过滤数据。

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

我找到了一个 similar Stack question,其中使用 XML 完成了此操作,并且我已经在 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


        }
    }

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;

    //...