【问题标题】:WPF DataGrid Column Template for custom object自定义对象的 WPF DataGrid 列模板
【发布时间】:2020-11-26 15:51:17
【问题描述】:

我有一个 WPF DataGrid 绑定到 DataTableDataTable 具有包含字符串的列和包含自定义对象的列 (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


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>

BindingRequirement 属性(SupplierStatusSupplierComment、...)不起作用并保持为空。如何绑定到存储在DataTable 中的自定义对象的属性?

【问题讨论】:

    标签: wpf datatable binding datagrid


    【解决方案1】:

    绑定不起作用,因为模板单元格的DataContextDataRowView

    您可以像在此related post 中一样创建转换器,也可以直接使用索引器绑定路径访问成员,其中requirement 是您在DataTable 中的列名称,例如:

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

    我将StackPanelDataContext设置为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>
    

    【讨论】:

    • 我的表的列是在运行时创建的,所以我不能按名称访问它们,但转换器工作正常。
    【解决方案2】:

    我在这篇文章中找到了解决方案: WPF DataGrid - Databind to DataTable cell in CellTemplates DataTemplate 您必须使用转换器才能从表格到达实际对象。

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2011-04-07
      相关资源
      最近更新 更多