Вот мой код:
foreach (var columnData in lookup.DataProvider.Metadata)
{
DataGridColumn column = new DataGridTextColumn { Binding = new Binding(columnData.FieldName) };
if (columnData.DataType == typeof(bool))
{
column = new DataGridCheckBoxColumn { Binding = new Binding(columnData.FieldName) };
}
if (columnData.DataType == typeof(DateTime))
{
column = new DataGridTemplateColumn();
//... ????
}
column.Header = columnData.Caption;
DataDataGrid.Columns.Add(column);
}
В основном я создаю столбцы и привязки в коде, потому что столбцы не известны во время разработки.
Теперь мне нужно добавить шаблонный столбеци не уверен, как написать это в C #.Вот пример XAML столбца, который мне нужно добавить:
<sdk:DataGridTemplateColumn Header="Received" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" SortMemberPath="SomeTime">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<MyControls:MyDateTimeLabel DisplayUtcDate="{Binding SomeTime}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
РЕДАКТИРОВАТЬ
В случае, если кто-то заинтересован.Я использовал решение отсюда: http://www.pettijohn.com/2011/01/silverlight-datagrid-with-dynamic.html
Я взял версию с загрузчиком XAML.Это определенно пахнет, так как мои пространства имен и т. Д. Жестко закодированы в строки.
Итак, я начал исследовать второй вариант.Вот как выглядит мой динамический столбец:
column = new DataGridTemplateColumn
{
CanUserSort = true,
SortMemberPath = columnData.FieldName,
CellTemplate = (DataTemplate)this.Resources["DateTimeColumnDataTemplate"]
};
Я загружаю DateTemplate
из ресурсов.Это было круто, но как мне связать?Здесь было предложено добраться до моего DateTimeLabel и установить привязку.Но это не сработало (см. Статью о том, почему).Итак, я написал этот код и все хорошо:
private void OnLoadingRow(object sender, DataGridRowEventArgs e)
{
foreach (DataGridColumn t in this.DataDataGrid.Columns)
{
if (t is DataGridTemplateColumn)
{
var label = t.GetCellContent(e.Row) as DitatDateTimeLabel;
label.SetBinding(DitatDateTimeLabel.DisplayUtcDateProperty, new Binding(t.SortMemberPath));
}
}
}