У меня есть сетка данных, к которой я привязываю 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. Что случилось с моим полем? Это исчезло? Может кто-нибудь дать мне знать, как это сделать или как я могу решить эту проблему
Заранее спасибо.