#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
}
}