Конечно, это возможно.Вы определите сетку данных и привязку в xaml, затем вам нужно будет выполнить привязку данных и добавить столбцы в коде.Обязательно и отключите autoGenerateColumns.Я держу отдельный список, который описывает мои столбцы.Я также определяю шаблон столбца в коде, так как я хочу, чтобы всплывающая подсказка и заголовки были разными для каждого столбца.Вот пример, который добавляет либо столбец с плавающей точкой, либо целочисленный столбец, вы можете добавить другие типы, если вам нужно:
Сначала определите сетку - я не думаю, что это имеет значение, что вы используете компонент один Сетка данных
<!-- NOTE: Creating columns is done Programmatically -->
<sdk:DataGrid x:Name="DataGridForDistrictSummaries" Grid.Column="1"
AutoGenerateColumns="False"
VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MinHeight="70"
ItemsSource="{Binding dataGridView}"
AlternatingRowBackground="LightBlue"
>
</sdk:DataGrid>
Затем вам нужно построить столбцы сетки, я перестрою всю сетку:
public static void BuildDataGridColumns(DataGrid dataGrid, List<DataGridColumnDescription> columnDescriptionList)
{
// clear out the old columns and re-build them with new criteria
dataGrid.Columns.Clear();
// add columns based on the description
int index = 0;
foreach (DataGridColumnDescription column in columnDescriptionList)
{
if (DataGridColumnDescriptionValueType.floatDataType == column.valueType)
{
dataGrid.Columns.Add(DataGridColumnBuilder.CreateFloatColumn(index++, column.name, column.header, column.description));
}
else
{
dataGrid.Columns.Add(DataGridColumnBuilder.CreateIntColumn(index++, column.name, column.header, column.description));
}
}
}
Это позволяет вам иметь различные типы данных в вашей сетке.Это важно для контроля того, как вы хотите отображать данные.В данном случае я хотел, чтобы отображались 2 десятичных знака
public static DataGridTextColumn CreateFloatColumn(int index, string fieldName, string header, string description)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Header = header;
column.HeaderStyle = BuildColumnHeaderStyle(description);
column.Binding = new Binding("floatValuesList[" + index + "]");
column.Binding.StringFormat = "0.00";
column.CellStyle = BuildFloatCellStyle(fieldName, description);
return column;
}
public static DataGridTextColumn CreateIntColumn(int index, string fieldName, string header, string description)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Header = header;
column.HeaderStyle = BuildColumnHeaderStyle(description);
column.Binding = new Binding("intValuesList[" + index + "]");
column.CellStyle = BuildCellStyle(fieldName, description);
return column;
}
Это определяет стиль в коде, я жестко запрограммировал некоторые вещи - но вы можете сделать его настолько динамичным, насколько вам нужно:
private static Style BuildColumnHeaderStyle(string tooltip)
{
FontWeight fw = FontWeights.Bold;
Style newGridHeaderStyle = new Style(typeof(DataGridColumnHeader));
newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.FontSizeProperty, Value = 9.0 });
newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.FontWeightProperty, Value = FontWeights.Bold });
newGridHeaderStyle.Setters.Add(new Setter { Property = DataGridColumnHeader.ContentTemplateProperty, Value = CreateDataGridColumnHeaderTemplate(tooltip) });
return newGridHeaderStyle;
}
private static Style BuildFloatCellStyle(string fieldName, string tooltip)
{
Style newGridCellStyle = new Style(typeof(DataGridCell));
newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.FontSizeProperty, Value = 11.0 });
newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.HorizontalContentAlignmentProperty, Value = HorizontalAlignment.Right });
return newGridCellStyle;
}
private static Style BuildCellStyle(string fieldName, string tooltip)
{
Style newGridCellStyle = new Style(typeof(DataGridCell));
newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.FontSizeProperty, Value = 11.0 });
newGridCellStyle.Setters.Add(new Setter { Property = DataGridCell.HorizontalContentAlignmentProperty, Value = HorizontalAlignment.Right });
return newGridCellStyle;
}
Вы также должны создать шаблон ячейки в коде.Это создает текстовую строку xaml и использует XamlReader для загрузки
private static DataTemplate CreateDataGridColumnHeaderTemplate(string tooltip)
{
string str = @"<DataTemplate xmlns='http://schemas.microsoft.com/client/2007'>"
+ @"<ContentControl Content='{Binding}'>"
+ @"<ToolTipService.ToolTip>"
+ @"<ToolTip Content='" + tooltip + "'>"
+ @"</ToolTip>"
+ @"</ToolTipService.ToolTip>"
+ @"</ContentControl >"
+ @"</DataTemplate>";
return (DataTemplate)XamlReader.Load(str);
}