【问题标题】:How to bind XML to DataGrid - WPF如何将 XML 绑定到 DataGrid - WPF
【发布时间】:2014-10-23 21:04:55
【问题描述】:

我在 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>

虽然这确实填充了 DataGrid,但它似乎填充了与 xRole 关联的所有属性。我可以理解这种情况正在发生,但我无法弄清楚如何获得我正在寻找的结果,即:“信息”和“名称”作为标题,属性值作为它们自己列中的单元格。

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

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

提前致谢!

【问题讨论】:

  • 来自MSDN当源是 XML 数据时,DataGrid 无法自动生成列。在这种情况下,创建一个自定义 Columns 集合
  • 谢谢。你能解释一下如何将单个属性绑定到不同的列吗?我在将属性输入列表并将该列表绑定到 1 列方面取得了一些成功,但我还没有弄清楚如何处理多个列。谢谢
  • 您是否尝试使用 XPath 绑定 DataGrid 列,例如 {Binding XPath=@Info}
  • 感谢您的回复。我已经编辑了我的 XAML。这是你的意思吗?

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


【解决方案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

【讨论】:

  • 没问题。很高兴它有帮助
【解决方案2】:

您可能已经尝试过,但您可以使用 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];

您可以遍历它们以构建更自定义的数据表。希望这对您有所帮助!

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 2011-05-14
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2013-06-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多