以编程方式绑定DataGridTemplateColumn

时间:2012-01-11 22:59:20

标签: c# silverlight xaml

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

您可以将DataTemplate置于Page / UserControl个资源中,在代码中检索并应用于您的专栏CellTemplate。它看起来像这样:

column.CellTemplate = (DataTemplate)this.Resources["DateTimeFieldTemplate"];

绑定现在应该与DataTemplate XAML中的绑定一样,因为在DataGrid行级别,您的DataContext将设置为项目本身。

相关问题