这是我的代码:
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));
}
}
}
.Select()
扩展方法,你能用匿名类型来控制它吗?(再次声明,我不知道Silverlight是如何工作的,所以这只是根据我在其他MS编程领域的经验猜测。) - Aidiakapi