C# 以编程方式绑定DataGridTemplateColumn
这是我的密码:C# 以编程方式绑定DataGridTemplateColumn,c#,silverlight,xaml,C#,Silverlight,Xaml,这是我的密码: foreach (var columnData in lookup.DataProvider.Metadata) { DataGridColumn column = new DataGridTextColumn { Binding = new Binding(columnData.FieldName) }; if (columnData.DataType == typeof(bool)) { col
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>
我正在从资源中加载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));
}
}
}
您可以将DataTemplate放在Page/UserControl资源中,在代码中检索它并应用于列的CellTemplate。它看起来像这样:
column.CellTemplate=DataTemplatethis.Resources[DateTimeFieldTemplate]
绑定现在应该像在DataTemplate XAML中一样工作,因为在DataGrid行级别上,您的DataContext将被设置为项本身。在黑暗中拍摄,可能不是我在silverlight/XAML方面没有专业知识,但不是有类似的东西。DataBind?是的,但我想要控制哪些列、哪些标题,Linq在所有IEnumerable上都有一个.Select扩展方法,你能用匿名类型来控制它吗?同样,我也不知道silverlight是如何工作的,所以这只是根据我在MS编程其他领域的经验进行的猜测。谢谢!事实上,我做得很糟糕:本文也展示了您的建议,我也同意您的建议,但如何动态指定DisplayUtcDate绑定到哪个字段呢。我真的很喜欢你的建议,但到目前为止还不知道如何做到这一点。如果你加载了DataTemplate,你可以执行DependencyObject content=template.LoadContent。如果数据模板如您在代码中所示,则内容将是MyDateTimeLabel控件。然后,可以使用控件上的SetBinding方法设置绑定动态。它看起来像MyDateTimeLabelcontent.SetBindingMyDateTimeLabel.DisplayUtcDateProperty,其中someBinding是对某些属性的绑定,与您对复选框或文本框所做的操作类似。请参见我的编辑。我必须在每行加载上设置绑定,否则它就无法工作。但现在我很擅长代码中没有XAML字符串。谢谢你的指点!
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));
}
}
}