这是我的代码:
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));
}
}
}
答案 0 :(得分:2)
您可以将DataTemplate
置于Page
/ UserControl
个资源中,在代码中检索并应用于您的专栏CellTemplate
。它看起来像这样:
column.CellTemplate = (DataTemplate)this.Resources["DateTimeFieldTemplate"];
绑定现在应该与DataTemplate
XAML中的绑定一样,因为在DataGrid
行级别,您的DataContext
将设置为项目本身。