Установите столбец WPF DataGrid.Заголовок из столбца данных.Подпись

#c# #wpf #datatable #datagrid

Вопрос:

Я использую a DataGrid для отображения содержимого a DataTable , которое я создаю динамически. По умолчанию это показывает заголовок DataColumn.ColumnName столбца в сетке данных.

Я пытаюсь заменить заголовки столбцов и скрыть некоторые столбцы в коде пользовательского контроля с AutoGenerateColumn помощью обработчика событий.

Работая в отладчике, я вижу, что свойство e.PropertyDescriptor имеет тип DataColumnPropertyDescriptor и может видеть его свойство столбца.Подпись.

Но во время выполнения я не могу найти способ получить к Column.Caption нему прямой доступ или использовать PropertyDescriptor как DataColumnPropertyDescriptor (внутренний закрытый класс).

 private void dgProviderValues_AutoGeneratedColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var pd = e.PropertyDescriptor as PropertyDescriptor;
    //e.Column.Header = pd.Column.Caption;
}
 

Как я могу добраться до объекта DataColumnPropertyDescriptor недвижимости?

Если это невозможно, есть какие-либо предложения по установке имен столбцов в DataTable / DataColumns , которые доступны при отображении DataGrid ?

PS это то, что я вижу в отладчике при наведении указателя мыши на значение pd: введите описание изображения здесь

Комментарии:

1. Не можете ли вы сохранить ссылку на DataTable и получить к ней доступ в обработчике событий? Это DataColumnPropertyDescriptor не даст вам значения Caption свойства базового DataTable . Где ты это видел?

2. Я использую Prism MVVM, поэтому хотел попытаться следовать принципам и решить эту проблему «должным образом». Неприятная вещь: глядя в отладчик, я вижу нужное значение прямо там, но не могу получить к нему доступ в программе.

Ответ №1:

Довольно тривиальное решение, когда я перестал зацикливаться на описателе недвижимости.

Событие вызывает этот вспомогательный метод с параметром; отправитель как DataGrid

     private void myDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        e.GridAutoGeneratingFromTable(sender as DataGrid);
    }

    public static void GridAutoGeneratingFromTable(this DataGridAutoGeneratingColumnEventArgs e, DataGrid dg)
    {
        var pd = e.PropertyDescriptor as PropertyDescriptor;
        if (dg.ItemsSource is DataView)
        {
            var dt = dg.ItemsSource as DataView;
            var col = dt.Table.Columns[e.PropertyName];
            //set e.Column.whatever = col.property
        }
    }