2012-12-04 46 views
3

我试图以编程方式将列添加到我的DataGrid,因为它们直到运行时才会知道。我已经完成了大部分工作,并且从后面的代码中添加“正常”列不是问题。然而,我现在想添加的列有一个DataTemplate。这里的XAML:WPF DataGrid以编程方式添加复杂列

<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 。有什么建议么?

感谢您的帮助!

回答

5

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

<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 
+0

感谢这个,今天应用它,得到它的工作! – qu1ckdry

0

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

代码来自上面的链接:(这是一种方式做着that.Otherway在该链接还解释)

的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); 
+0

给我与我的完全相同的答案有什么意义?如果你想给出链接(这是interresting),对我的答案的简单评论就足够了。 – Sisyphe

+0

感谢您的链接,它是一个有用的阅读 – qu1ckdry

相关问题