Принудительная установка DataTemplateCell с помощью CellTemplateSelector в автоматически создаваемых столбцах WPF DataGrid
У меня есть сетка данных, к которой я привязываю DataTable. Я не знаю, какие строки или столбцы будут в таблице данных, поэтому я установил для свойства AutogenerateColumns сетки данных значение true. Единственное, что я точно знаю, это то, что каждая ячейка в таблице данных будет иметь тип Field, а класс Field имеет свойство enum с именем Type.
<DataGrid
x:Name="dg"
AutoGenerateColumns="True"
ItemsSource="{Binding Path=Fields}"
AutoGeneratingColumn="dg_AutoGeneratingColumn">
</DataGrid>
То, что я хочу сделать, это заставить все автоматически сгенерированные столбцы быть DataTemplateColumns, у которых свойство CellTemplateSelector установлено в объект FieldCellTemaplateSelector. Для этого я добавляю следующий код события AutoGeneratingColumn:
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
//cancel the auto generated column
e.Cancel = true;
//create a new template column with the CellTemplateSelector property set
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
dgtc.CellTemplateSelector = new FieldCellTemplateSelector();
dgtc.IsReadOnly = true;
dgtc.Header = e.Column.Header;
//add column to data grid
DataGrid dg = sender as DataGrid;
dg.Columns.Add(dgtc);
}
Код для класса FieldCellTemplateSelector выглядит следующим образом:
public class FieldCellTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return base.SelectTemplate(item, container);
}
}
В методе SelectTemplate мне нужно получить объект Field, содержащийся в ячейке, и вернуть соответствующий шаблон данных на основе свойства Type этого поля. Проблема заключается в том, что передаваемый параметр элемента не имеет типа Field, он имеет тип DataRowView.
Я могу получить объект DataGridCell, выполнив следующие действия:
ContentPresenter presenter = container as ContentPresenter;
DataGridCell cell = presenter.Parent as DataGridCell;
Однако контекст данных ячейки также имеет тип DataRowView. Что случилось с моим полем? Это исчезло? Может кто-нибудь, дайте мне знать, как достичь этого или как я могу найти решение этой проблемы
Заранее спасибо.
1 ответ
Я была такая же проблема. Нашел ответ по этой ссылке.
http://social.msdn.microsoft.com/Forums/en/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062