2011-10-19 136 views
0

我试图从XML文件中读取所有属性中的“数据”元素,并在DataGrid中显示这些数据的未知量(WPF,.NET 4.0)填充WPF的DataGrid从XML

XML格式如下所示。

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

我没有使用的属性名称(例如:NAME1,NAME2的Foo等)或属性的数量的想法有在每个元件(每个元件可能不同数量的属性)。每个新元素应显示在新行上,并且每个属性对应一列(如果该行不存在,则显示为空行)。

我正在努力为要绑定的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); 
} 

我然后在每个迭代属性并将其添加到列表(表示在数据网格显示行),如果属性名称匹配的报头的一个值

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); 
} 

我一些存在的方式......但有一个DataGrid空行(正确的行数,但现在显示数据)。

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

回答

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

+0

感谢的是......这个来了可怕的空行(即没有显示数据)。我可以确认dataGrid.ItemsSource被设置为XML元素,并且列绑定是正确的 - 但仍不显示任何数据。 – drew

+0

您是否遵循我所展示的XmlDataProvider方法? –

+0

我已经离开了几天。刚回来并尝试了XmlDataProvider解决方案。工作得很好。感谢您向正确的方向点头。 – drew