Привязка WPF DataGrid к таблице данных

Это сводит меня с ума. Я создаю 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]

6
задан Noam M 13 August 2015 в 08:38
поделиться