Шаблон столбца WPF DataGrid для настраиваемого объекта - PullRequest
0 голосов
/ 06 августа 2020

У меня WPF DataGrid привязан к DataTable. В DataTable есть столбцы, содержащие строки, и столбцы, содержащие настраиваемые объекты (Requirement):

public class PdfFormData
{
    public string SupplierName { get; set; }
    public List<Requirement> Requirements = new List<Requirement>();

    public class Requirement
    {
        public string ID { get; set; }
        public string SupplierStatus { get; set; }
        public string SupplierComment { get; set; }
        public string OEMStatus { get; set; }
    }
}

Я добавляю столбцы в DataGrid с этим l oop:


PHDataGrid.ItemsSource = dataSet.Tables["ReqIfTable"].DefaultView;
PHDataGrid.Columns.Clear();
foreach (DataColumn dataColumn in dataSet.Tables["ReqIfTable"].Columns)
{
   if(dataColumn.DataType == typeof(ReqForms.PdfFormData.Requirement))
   {
      DataGridTemplateColumn dgColumn = new DataGridTemplateColumn();
      dgColumn.Header = dataColumn.ColumnName;
      dgColumn.CellTemplate = (DataTemplate)FindResource("dgTemplateRequirement");

      dgColumn.CanUserSort = true;
      dgColumn.IsReadOnly = true;
      PHDataGrid.Columns.Add(dgColumn);
   }
   else
   {
      DataGridTextColumn dgColumn = new DataGridTextColumn();
      dgColumn.Header = dataColumn.ColumnName;
      Binding dgBinding = new Binding(dataColumn.ColumnName);
      dgColumn.Binding = dgBinding;
      dgColumn.CanUserSort = true;
      dgColumn.IsReadOnly = true;
      PHDataGrid.Columns.Add(dgColumn);
   }
}

И я определил шаблон для отображения моих Requirement объектов:

<Window.Resources>
    <DataTemplate x:Key="dgTemplateRequirement">
        <StackPanel Orientation="Vertical">
            <TextBlock Text="{Binding Requirement.SupplierStatus}" />
            <TextBlock Text="{Binding Requirement.SupplierComment}" />
            <TextBlock Text="{Binding Requirement.OEMStatus}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>

Binding для свойств Requirement (SupplierStatus, SupplierComment, ... ) не работает и остается пустым. Как я могу привязаться к свойствам моего настраиваемого объекта, который хранится в DataTable?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Привязки не работают, потому что DataContext шаблонной ячейки - это DataRowView.

Вы можете создать конвертер, как в этом посте , или просто получить доступ к членам напрямую с помощью пути привязки индексатора, где requirement - это имя вашего столбца в DataTable, например:

<TextBlock Text="{Binding Row[requirement].SupplierStatus}" />

Я установил DataContext из StackPanel на Requirement объект, поэтому привязать его еще проще.

<DataTemplate x:Key="dgTemplateRequirement">
   <StackPanel Orientation="Vertical" DataContext="{Binding Row[requirement]}">
      <TextBlock Text="{Binding SupplierStatus}" />
      <TextBlock Text="{Binding SupplierComment}" />
      <TextBlock Text="{Binding OEMStatus}" />
   </StackPanel>
</DataTemplate>
0 голосов
/ 06 августа 2020

Я нашел решение в этом посте: WPF DataGrid - привязка данных к ячейке DataTable в шаблоне данных CellTemplates Для перехода от таблицы к фактическому объекту необходимо использовать конвертер.

...