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;
//...
我正在尝试向项目中的每一列 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;
//...