如何将Wpf数据网格绑定到动态创建的列名,值对?

时间:2017-11-14 09:33:00

标签: c# wpf datagrid

我有多组列表,其中包含有关列标题和该列值的数据。对于任何特定集合,列标题保持不变。但它们对于不同的集合是不同的。集合中的每个列表都将表示数据网格中的一行。在特定时间,一组数据将显示在grid.Hence中,列标题对于该组中的所有列表将是相同的。列表中的值将以行显示。假设我们有两个列表:

List<Data> l1 = new List<Data>(){new Data(){Header="A",Value="A1"},new Data(){Header="B",Value="B1"}};
List<Data> l2 = new List<Data>(){new Data(){Header="A",Value="A2"},new Data(){Header="B",Value="B2"}};

数据应在网格中显示为:

  A       B
  A1      B1
  A2      B2

所以,我如何实现这一点,就像创建绑定一样,我必须创建公共属性。我不能硬编码这些属性,因为它们是动态的。

1 个答案:

答案 0 :(得分:0)

我使用ASh建议使用DataTable解决了这个问题.Below是我用来将数据转换为DataTable的代码。

public static DataTable GenerateDataGridFromMetaData(List<ObservableCollection<DocumentMetaData>> dataList)
{
    try
    {
        if (dataList.Count > 0)
        {
                    DataTable dataTable = new DataTable();
                    List<int> skipColumn = new List<int>();
                    for (int index = 0; index < dataList.Count; index++)
                    {
                        ObservableCollection<DocumentMetaData> metaDataList = dataList[index];
                        List<string> values = new List<string>();
                        for (int metaDataIndex = 0; metaDataIndex < metaDataList.Count; metaDataIndex++)
                        {
                            DocumentMetaData docMetaData = metaDataList[metaDataIndex];
                            if (index == 0)
                            {
                                if (!dataTable.Columns.Contains(docMetaData.Title))
                                {
                                    dataTable.Columns.Add(docMetaData.Title);
                                    values.Add(docMetaData.Value); 
                                }
                                else
                                {
                                    skipColumn.Add(metaDataIndex);
                                }
                            }
                            else
                            {
                                if (!skipColumn.Contains(metaDataIndex))
                                {
                                    values.Add(docMetaData.Value); 
                                }
                            }
                        }
                        dataTable.Rows.Add(values);
                    }
                    return dataTable;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
            }    
        }

这是我用来将数据表绑定到网格的代码。

DataTable table = GridViewConverter.GenerateDataGridFromMetaData(dataList);
DataGrid.ItemsSource = table.DefaultView;

请确保AutoGenerateColumns属性设置为true,否则网格不会显示数据。