2014-08-29 88 views
1

我有一個WPF中的DataGrid,我想填充一個XML文件的結果,但我不確定如何去做。如何綁定XML到DataGrid - WPF

我已經成功填充了具有各種元素屬性的列,但是我希望爲每個分配給我的XML文件中的元素的屬性設置單獨的列。

我的XML格式如下:

<?xml version="1.0"?> 
-<Roles User="Mr 1"> 
     <Role Info="Information 1" Name="Role1"> </Role> 
     <Role Info="Information 2" Name="Role2"> </Role> 
</Roles> 

等等......隨着各種用戶,用分配給每個角色。

我VB.Net代碼如下:

Private Sub DataGridTest_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 
Dim xDoc = XDocument.Load("\Roles.xml") 
Dim xRoles = xDoc...<Role> 

MyDataGrid.DataContext = xRoles 

End Sub 

我的XAML如下:

<Grid Style="{StaticResource ContentRoot}"> 
      <DataGrid Name="MyDataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Height="500" > 
       <DataGrid.Columns> 
         <DataGridTextColumn Binding="{Binding [email protected]}" Header="Role" /> 
         <DataGridTextColumn Binding="{Binding [email protected] }" Header="Information" /> 
       </DataGrid.Columns> 
      </DataGrid> 
    </Grid> 

雖然這並填充DataGrid,似乎與相關聯的所有屬性填充它xRole。我可以理解這種情況正在發生,但我無法弄清楚如何得到我要查找的結果,即'Info'和'Name'作爲標題,以及Attribute Values作爲其自己列中的單元格。

我曾嘗試使用屬性值填充列表,手動創建列,然後將列表綁定到列 - 這可能是正確的方法嗎? - 但我只能弄清楚如何將1列表綁定到其中一列。是否可以有兩個單獨的列表並將它們分別綁定到它們自己的列?

我意識到我可能在這裏問2個單獨的問題 - 道歉。我發現信息稀疏的具體問題 - 特別是有關VB.Net

在此先感謝!

+0

:_DataGrid無法自動生成列時源是XML數據。在這種情況下,創建一個自定義的Columns collection_ – dkozl 2014-08-29 19:54:26

+0

謝謝。你能解釋一下如何將各個屬性綁定到不同的列上嗎?在將屬性輸入到列表中並將該列表綁定到1列方面,我已經取得了一些成功,但我還沒有弄清楚如何處理多列。謝謝 – 2014-08-29 19:56:11

+0

您是否嘗試使用XPath綁定'DataGrid'列,如{{Binding XPath = @ Info}'? – dkozl 2014-08-29 19:57:54

回答

1

由於根據MSDN

DataGrid中當源是XML數據不能自動生成列

您需要手動創建列

<DataGrid Name="MyDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Path=Elements[Role]}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Attribute[Name].Value}" Header="Name" /> 
     <DataGridTextColumn Binding="{Binding Path=Attribute[Info].Value}" Header="Info"/> 
    </DataGrid.Columns> 
</DataGrid> 

,並在代碼

MyDataGrid.DataContext = xDoc.Root 
[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.autogeneratecolumns(v = vs.110).aspx)中的
+1

非常好 - 謝謝。我錯過了.Root – 2014-08-29 20:31:49

+0

沒問題。很高興幫助 – dkozl 2014-08-29 20:34:37

0

您可能已經嘗試過,但可以使用DataSet.ReadXml(filename)。

public DataSet getData() 
    { 
     DataSet ds; 
     // Create an XmlReader 
     using (XmlReader reader = XmlReader.Create(new StringReader(results))) 
     { 
      ds.ReadXml(reader); 
     } 

     return ds; 
    } 

我在這裏使用了一個閱讀器,但直接從xml文件中讀取時也是如此。在你有了DataSet之後,你可以像這樣通過這些表...

DataTable testDataTable1 = ds.Tables[0]; 
    DataTable testDataTable2 = ds.Tables[1]; 

你可以遍歷它們來構建一個更自定義的數據表。希望這能以某種方式幫助你!