DataTemplate в DataGridColumnHeader WPF C#

У меня возникли проблемы с применением DataTemplate ко всем столбцам в сетке данных с динамически генерируемыми столбцами. ItemsSource привязан к свойству DataTable в виртуальной машине. Все, кроме шаблона, работает нормально. Сейчас это всего лишь начальное доказательство концепции, поэтому данные — мусор, но нужна помощь с доказательством концепции.

Код следующим образом:

Вид:

<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>
    <DataGrid.Columns>                
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <Button Content="ok"/>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
            </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

ViewModel — при загрузке я пока создаю таблицу. Очевидно, что в конечном итоге он будет заменен вызовом БД...

[ImportingConstructor]
    public GenericQueueViewModel()
    {           
        int y = new Random().Next(20);
        TestList = createTableForDataGrid(y);
    }

    private DataTable createTableForDataGrid(int numberOfCols)
    {
        DataTable test = new DataTable();
        for (int i = 0; i < numberOfCols; i++)
        {
            DataColumn oDc = new DataColumn();                
            test.Columns.Add(oDc);
        }
        Random x = new Random();
        int y = x.Next(100);
        for (int i = 0; i <= y; i++)
        {
            DataRow oRow = test.NewRow();
            for (int j = 0; j < test.Columns.Count; j++)
            {
                oRow[j] = i.ToString() + " | " + j.ToString();
            }
            test.Rows.Add(oRow);
        }
        return test;
    }

private DataTable _testList;

    public DataTable TestList
    {
        get { return _testList; }
        set 
        { 
            _testList = value;
            OnPropertyChanged(() => TestList);
        }
    }

И результат:

введите здесь описание изображения

Это похоже на то, что DataGrid изначально создается с помощью шаблона, но когда срабатывает OnPropertyChanged, шаблон не вызывается. Сетка заполняется просто отлично, но без кнопок в заголовках.

Нужно ли мне что-то делать со StaticResource, чтобы заставить это работать? Вытащить стиль из сетки? Я не совсем уверен, почему это не работает.

Динамическое решение обязательно. Это для очереди, которая будет загружена «чем угодно»… может быть, 5 столбцов, может быть, 200. Поэтому я не могу определить столбцы по отдельности.


person Aaron    schedule 01.10.2014    source источник
comment
Однако при просмотре я только что заметил, что в столбце 0 ничего не генерируется, а данные, которые должны быть в столбце 0, находятся в столбце 1, 1 в 2 и т. Д.   -  person Aaron    schedule 01.10.2014


Ответы (1)


Таким образом вы фактически создаете один дополнительный столбец. Чтобы исправить это, вам нужно создать стиль для настройки шаблона заголовка столбца и установить шаблон заголовка. Что-то вроде ниже:

<Style TargetType="DataGridColumnHeader">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Button Content="Ok"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<DataGrid AutGenerateColumns="true" ItemsSource={Binding xxx} etc...>

</DataGrid>
person ajay gandhi    schedule 01.10.2014
comment
Идеально. Я пробовал это раньше, но получал сообщение об ошибке, что контент уже установлен. Я не осознавал, что тег Style должен находиться в теге UserControl.Resources. Еще немного исследований, и я понял, куда его поставить. Он отлично работает. Спасибо! - person Aaron; 01.10.2014