У меня возникли проблемы с применением 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. Поэтому я не могу определить столбцы по отдельности.