如何将XML绑定到DataGrid - WPF

时间:2014-08-29 19:50:48

标签: xml wpf vb.net datagrid linq-to-xml

我在WPF中有一个DataGrid,我想用XML文件的结果填充,但我不确定如何这样做。

我已设法使用各种元素属性填充列,但我希望为每个属性分别使用分配给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 XPath=@Name}" Header="Role" />
                      <DataGridTextColumn Binding="{Binding XPath=@Info }" Header="Information" />
                </DataGrid.Columns>
           </DataGrid>
    </Grid>

虽然这个DOES填充了DataGrid,但它似乎用与xRole相关的所有属性填充它。我可以理解这种情况正在发生,但我无法弄清楚如何获得我正在寻找的结果,即:'Info'和'Name'作为标题,属性值作为单元格在他们自己的列中。< / p>

我尝试使用属性值填充列表,手动创建列,然后将列表绑定到列 - 这可能是正确的方法吗? - 但我只能想出如何将1个列表绑定到其中一个列。是否可以拥有2个单独的列表并将它们单独绑定到自己的列中?

我意识到我可能会在这里提出两个不同的问题 - 道歉。我发现特定问题的信息很少 - 尤其是与VB.Net有关的信息

提前致谢!

2 个答案:

答案 0 :(得分:1)

根据MSDN

  

当源是XML数据时,DataGrid无法自动生成列

您需要手动创建列

<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

答案 1 :(得分: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];

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