2013-12-18 96 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