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));
            }
        }
    }