2013-12-18 70 views
2

我有一个DataGrid绑定到一个DataTable.DefaultView,它使用自动生成列来呈现网格。这部分工作正常。但是,对于某些列,我想使用自定义模板。问题是表中的列在每次加载时都会改变,所以解决方案需要是通用的。DataGrid的自定义列模板

我可以挂接到AutoGeneratingColumn事件描述here,但仍与定义模板结合有问题:

<UserControl.Resources> 
    <DataTemplate x:Key="customCellTemplate"> 
     <TextBlock Text="{Binding ???"></TextBlock> 
    </DataTemplate> 
</UserControl.Resources> 

(...) 

<DataGrid ItemsSource="{Binding DefaultView}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"> 
</DataGrid> 

而且我后面的代码:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    string colName = e.PropertyName; 
    if (someCondition) 
    { 
     var templateColumn = new DataGridTemplateColumn(); 
     templateColumn.Header = colName; 
     templateColumn.CellTemplate = (DataTemplate)Resources["customCellTemplate"]; 
     templateColumn.SortMemberPath = colName; 
     e.Column = templateColumn; 
    } 

正如你可以看到我不不知道如何在列模板中定义绑定,因为列名更改。

编辑:

除了公认的答案 - 有时更容易编程创建整个模板如下所述: http://fczaja.blogspot.com/2013/12/wpf-datagrid-custom-template-for.html

回答

1

使用StaticResource迫使你保持相同的 - 记住,静态意味着只有一个实例,所以如果你改变了它对一列的绑定,你会改变它的所有。因此,它必须是这样的:

<DataTemplate x:Key="customCellTemplate"> 
    <TextBlock Text="{Binding}"></TextBlock> 
</DataTemplate> 

我想你可以通过使用ContentControl在其他的DataTemplate它包裹在一个动态的方式使用该模板。动态设置Content财产,并使用静态模板为ContentTemplate

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    string colName = e.PropertyName; 
    if (someCondition) 
    { 
     string xaml = @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""><ContentControl Content=""{0}"" ContentTemplate=""{1}"" /></DataTemplate>"; 
     var tmpl = (DataTemplate)XamlReader.Load(string.Format(xaml, "{Binding " + colName + "}", "{StaticResource customCellTemplate}")); 
     var templateColumn = new DataGridTemplateColumn(); 
     templateColumn.CellTemplate = tmpl; 
     templateColumn.Header = colName; 
     templateColumn.SortMemberPath = colName; 
     e.Column = templateColumn; 
    } 
} 

,唯一的缺点是,这种设置,我相信“customCellTemplate”将在应用程序级别定义。

+0

这种方法是有效的,但是我需要在用户控制层上定义这个单元模板,而不是应用程序。原因是我正在开发一个UserControl库,它将被多个应用程序重用。任何解决方法? 此外,由于XamlReader.Load期望流(简单修复),因此当前代码无法编译。 – filip