Это сводит меня с ума. Я создаю DataGrid в коде и затем связываю его с таблицей данных. Это динамично и строки, и столбцы будут отличаться каждый раз, сетка создается.
В основном я циклично выполняюсь через свою таблицу данных и создаю Столбцы сетки данных для каждого столбца, как это:
private static void CreateDataGridColumns(DataGrid datagrid, Document doc)
{
if (doc == null) return; //return
datagrid.Columns.Clear();
foreach (var item in doc.Keys)
{
var column = new DataGridTemplateColumn
{
Header = item,
CellTemplateSelector = new CustomRowDataTemplateSelector(),
};
datagrid.Columns.Add(column);
}
}
Как Вы видите, я использую пользовательский шаблонный селектор данных, таким образом, я могу представить ячейку по-другому для в зависимости от ее содержания.
Вот шаблонный селектор
public class CustomRowDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
var presenter = container as ContentPresenter;
var gridCell = presenter.Parent as DataGridCell;
if (element != null && item != null && gridCell != null)
{
var row = item as DataRow;
if (row != null)
{
var cellObject = row[gridCell.Column.DisplayIndex];
//set template based on cell type
if (cellObject is DateTime)
{
return element.FindResource("dateCell") as DataTemplate;
}
return element.FindResource("stringCell") as DataTemplate;
}
}
return null;
}
}
Вот мой stringCell DataTemplate
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Проблема состоит в том, что шаблонный селектор называют для каждой ячейки (как ожидалось), но я не могу сказать, какая ячейка это, таким образом, я не знаю, как установить текст на TextBlock. Я хотел бы сделать что-то вроде этого
<DataTemplate x:Key="stringCell">
<StackPanel>
<TextBlock Style="{StaticResource cellStyle}"
Grid.Row="0" Grid.Column="0"
Text="{Binding Path=Row[CellIndex], Converter={StaticResource cellConverter}}" />
</StackPanel>
</DataTemplate>
Но нет ничего доступного для меня для получения CellIndex. Как я могу сделать что-то подобное этому, где я могу установить Path=Row[CellIndex]