WPF DataGrid以编程方式添加复杂列

时间:2012-12-04 10:30:14

标签: .net wpf xaml wpfdatagrid

我正在尝试以编程方式向我的DataGrid添加列,因为它们在运行时才知道。我已经完成了大部分工作,并且从代码中添加“普通”列并不是问题。但是,我正在尝试添加的列现在有一个DataTemplate。这是XAML:

<DataGridTemplateColumn Header="{Binding colHeader}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Border BorderBrush="{Binding BorderColour}" BorderThickness="2">
                <TextBlock Text="{Binding TextInfo}" />
            </Border>
        </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

通常我会使用类似的东西来创建一个要添加到网格中的列:

Private Function AddColumn(colHeader As String, colBinding As String) As DataGridColumn
    Dim textColumn As New DataGridTextColumn()
    textColumn.Header = colHeader
    textColumn.Binding = New Binding(colBinding)
    Return textColumn
End Sub

但我对如何添加更复杂的XAML感到难过。有什么建议吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

在具有x:Key属性的资源字典中定义列的DataTemplate,然后在后面的代码中访问它以设置单元格模板。

<DataTemplate x:Key="your_data_template">
    <Border BorderBrush="{Binding BorderColour}" BorderThickness="2">
        <TextBlock Text="{Binding TextInfo}" />
    </Border>
</DataTemplate>

然后在

背后的代码中
textColumn.CellTemplate = Application.Current.FindResource("your_data_template") as DataTemplate

答案 1 :(得分:0)

参考链接:http://blogs.msdn.com/b/scmorris/archive/2008/04/14/defining-silverlight-datagrid-columns-at-runtime.aspx

代码段来自上面的链接:(这是这样做的一种方式。其他方式也在该链接中解释)

的Xaml:

<UserControl.Resources>
<local:DateTimeConverter x:Key="DateConverter" />

<DataTemplate x:Key="myCellTemplate">
    <TextBlock 
        Text="{Binding Birthday, 
        Converter={StaticResource DateConverter}}" 
        Margin="4"/>
</DataTemplate>

<DataTemplate x:Key="myCellEditingTemplate">
    <basics:DatePicker 
        SelectedDate="{Binding Birthday, Mode=TwoWay}" />
</DataTemplate>

代码背后:

DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Birthday";
templateColumn.CellTemplate = (DataTemplate)Resources["myCellTemplate"];
templateColumn.CellEditingTemplate = 
                   (DataTemplate)Resources["myCellEditingTemplate"];
targetDataGrid.Columns.Add(templateColumn);