簡體   English   中英

如何將Wpf Datagrid綁定到動態創建的列名,值對?

[英]How to bind Wpf datagrid to dynamically created column name,value pairs?

我有多個列表集,其中包含有關列標題和該列的值的數據。對於任何特定的集合,列標題都保持不變,但是對於不同的集合它們是不同的。一個集合中的每個列表將代表一行數據網格在特定時間將在網格中顯示一組數據,因此該組中所有列表的列標題都將相同,並且列表中的值將以行顯示。 假設我們有兩個列表:

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

因此,我該如何實現這一點,就像創建綁定一樣,我必須創建公共屬性,而且由於這些屬性是動態的,因此我無法對其進行硬編碼。

我通過使用ASh提出的使用DataTable的建議解決了這個問題。以下是我用於將數據轉換為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,否則網格將不會顯示數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM