以编程方式绑定DataGridTemplateColumn

3

这是我的代码:

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

可能只是瞎猜,也许不是这种情况(我对Silverlight/XAML没有专业知识),但是难道没有类似于“.DataBind()”这样的东西吗? - Aidiakapi
是的,但我想要控制哪些列,哪些标题等。 - katit
Linq在所有的IEnumerable<T>上都有一个.Select()扩展方法,你能用匿名类型来控制它吗?(再次声明,我不知道Silverlight是如何工作的,所以这只是根据我在其他MS编程领域的经验猜测。) - Aidiakapi
1个回答

2
您可以将DataTemplate放在Page/UserControl资源中,在代码中检索并应用于列的CellTemplate。代码如下: column.CellTemplate = (DataTemplate)this.Resources["DateTimeFieldTemplate"]; 由于在DataGrid行级别上,您的DataContext将设置为该项本身,因此绑定应该像现在DataTemplate XAML中一样工作。

谢谢!实际上,我用了一种“不好”的方法:http://www.pettijohn.com/2011/01/silverlight-datagrid-with-dynamic.html 这篇文章也展示了你的建议,我会采纳它,但是我该如何动态指定DisplayUtcDate绑定到哪个字段呢?我真的很想按照你的建议去做,但目前还无法弄清楚如何实现。 - katit
2
如果您已经加载了DataTemplate,则可以执行DependencyObject content = template.LoadContent()。 如果数据模板与您在代码中提供的相同,则content将是您的MyDateTimeLabel控件。 然后,您可以在控件上使用SetBinding方法动态设置绑定。 它看起来像这样:((MyDateTimeLabel)content).SetBinding(MyDateTimeLabel.DisplayUtcDateProperty, someBinding),其中someBinding是到某个属性的绑定(类似于您为CheckBoxTextBox所做的操作)。 - dmusial
看到我的编辑了吗?我必须在每行加载时设置绑定,否则它不起作用。但现在我很好,代码中没有XAML字符串。感谢有用的指针! - katit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接