我目前有一个数据网格,其中包含每列的唯一上下文菜单。示例xaml如下:
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="ContextMenu" Value="{StaticResource default_columnHeaderMenu}" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Person" Binding="{Binding Path=PersonID}" CellStyle="{StaticResource CenterAlignedCellStyle}" />
...
在上下文菜单中,我有一个名为“Insert column”的项目,然后包含一个列表,如下所示:
<ContextMenu x:Key="default_columnHeaderMenu" Name="defaultColumnHeaderMenu">
<MenuItem Header="Insert Column" >
<MenuItem Header="Person ID" Click="addColumn"/>
<MenuItem Header="Health" />
<MenuItem Header="Person Description" />
<MenuItem Header="Person Age" />
.....
我的问题是,使用列标题上下文菜单,将这些列添加或复制到数据网格中的最简单方法是什么? (我不是在寻找一个全新的,空白的专栏,而是某个已经退出的专栏的“复制”,带有相同的数据等。)
使用DataGrid.Columns,有没有办法根据标题名称找到列的索引?
感谢您提供任何帮助/建议。
答案 0 :(得分:1)
您可以将列定义为非共享资源:
<DataGridTextColumn x:Key="PersonColumn" x:Shared="False" Header="Person" Binding="{Binding Path=PersonID}" CellStyle="{StaticResource CenterAlignedCellStyle}" />
然后在菜单项事件中,您可以检索它并将其添加到DataGrid:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
var col = FindResource("PersonColumn") as DataGridTemplateColumn;
dataGrid.Columns.Add(col);
}