使用来自XML的未知数据量填充WPF DataGrid

时间:2011-10-19 02:18:54

标签: c# wpf xml datagrid

我正在尝试从xml文件中读取“Data”元素中的所有属性,并将它们显示在DataGrid(WPF,.Net 4.0)中

XML的格式如下所示。

<root>
  <Data Name1="Value1" Name2="Value2" ... />
  <Data Name1="Value1" Name2="Value2" ... />
  ...
</root>

我不知道所使用的属性名称(例如Name1,Name2,Foo等)或每个元素中的属性数(每个元素可能有不同数量的属性)。每个新元素都应该显示在一个新行上,每个属性对应一个列(如果该行不存在则显示为null)。

我正在努力为datagrid创建一个支持类来绑定,或者以编程方式创建它。

我目前的尝试是创建一组文本列(根据我从xml文件中提取的内容给出要使用的列名列表)

List<string> dataTags = ...; //get list of attributes to use from xml
foreach (string d in dataTags) {
    DataGridTextColumn col = new DataGridTextColumn();
    col.Header = d;
    dataGrid.Columns.Add(col);
}

然后我遍历每个属性并将其添加到列表中(表示要在datagrid中显示的行),如果属性名称与其中一个标题值匹配

foreach (XElement e in xml.Descendants("Data")) {
    //Store values to be added to the datagrid as a new row
    List<string> row = new List<string>();

    //Only add data where the attribute name matches one of the 'dataTags' we are given.
    foreach(string d in dataTags) {
        foreach (XAttribute a in e.Attributes()) {
            if (d.Equals(a.Name.ToString())) {
                row.Add(a.Value);
                break;
            }
        }
    }

    //Add new row to the datagrid
    dgData.Items.Add(row);
}

我有一些方法......但是有一个带空行的数据网格(正确的行数,但现在显示的是数据)。

任何提示/指示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您动态创建列的代码是正确的。

但是您在数据网格中添加项目的代码不正确。在配置列时,为其分配XPATH。

  List<string> dataTags = ...; //get list of attributes to use from xml 
  foreach (string d in dataTags)
  {
         DataGridTextColumn col = new DataGridTextColumn();
         col.Binding = new Binding() { XPath = "@" + d } ;
         col.Header = d;
         dataGrid.Columns.Add(col);
  } 

然后将您的XmlNodes作为ItemsSource分配给datgrid ...

  dataGrid.ItemsSource = xml.Descendants("Data");

此文还有使用XmlDataProvider

的文章