Принудительная установка DataTemplateCell с помощью CellTemplateSelector в автоматически создаваемых столбцах WPF DataGrid - PullRequest
0 голосов
/ 16 января 2012

У меня есть сетка данных, к которой я привязываю 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 Ответ

1 голос
/ 25 января 2012

У меня была такая же проблема. Нашел ответ по этой ссылке.

http://social.msdn.microsoft.com/Forums/en/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

...