2011-10-19 172 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