Как скопировать существующий столбец и вставить его в datagrid?

#c# #wpf #xaml #mvvm

#c# #wpf #xaml #mvvm

Вопрос:

В настоящее время у меня есть datagrid, который содержит уникальное контекстное меню для каждого столбца.. пример 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}" />
  

….

Внутри контекстного меню у меня есть пункт под названием «Вставить столбец», который затем содержит список столбцов следующим образом:

        <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.Столбцы, есть ли способ каким-то образом найти индекс столбца на основе имени заголовка?

Спасибо за любую помощь / предложения.

Ответ №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);
}
  

Комментарии:

1. Спасибо за предложение, хотя, похоже, у меня не может быть свойства «Key» для моих столбцов.

2.Я отметил, что вы должны определить его как ресурс, т. Е. в каком-нибудь словаре ресурсов, например, <Window.Resources><!-- Here --></Window.Resources> MSDN о ресурсах

3. Спасибо. Я смог добиться результатов. Хотя еще один вопрос, существуют ли какие-либо ограничения для «необщего» ресурса с точки зрения привязки к данным? Если бы я добавил новый столбец «Person», сохранил бы этот столбец те же данные двусторонней привязки, что и в оригинале?

4. Я полагаю, у него была бы не та же привязка, но идентичная.