#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. Я полагаю, у него была бы не та же привязка, но идентичная.