[英]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.