2014-08-29 84 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]; 

你可以遍历它们来构建一个更自定义的数据表。希望这能以某种方式帮助你!