2013-12-18 5 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; 
    } 

Как вы можете видеть, что я дон Не знаю, как определить привязку в шаблоне столбца, потому что имя столбца изменяется.

EDIT:

В дополнение к принятому ответ - иногда это легче создать весь шаблон программно, как описано здесь: http://fczaja.blogspot.com/2013/12/wpf-datagrid-custom-template-for.html

ответ

1

с помощью StaticResource заставляет вас держать это то же самое - помните, что static означает, что есть только один экземпляр, поэтому, если вы измените привязку для одного столбца, вы измените его для всех из них. Так что придется выглядеть так:

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

Я думал, вы могли бы использовать этот шаблон в динамике, обернув его в другой DataTemplate с помощью ContentControl. Установите 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

Смежные вопросы