WPF,XML Datagrid绑定

时间:2014-02-12 22:32:27

标签: xml wpf datagrid wpfdatagrid

我有一个类似下面的XML文件。我计划将XML文件的内容绑定到WPF中的Datagrid。

<?xml version="1.0" encoding="utf-8"?>
<ProductData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PurchaseOrderLine>
    <ProductItem>
        <LineNumber>1</LineNumber>  
    </ProductItem>
</PurchaseOrderLine>

所以我为PurchaseOrderLine和ProductItem开发了两个简单的类,如下所示

class PurchaseOrderLine {
    public ProductItem productItem { get; set; }}

class ProductItem{
    public int LineNumber { get; set; }}

之后当我尝试在下面的xaml中访问它时,我无法获取LineNumber的详细信息,为什么会这样?我错过了吗?其实请告诉我如何在xml中访问子元素?

 <DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="{Binding Path=Elements[PurchaseOrderLine]}" Height="214" Width="657">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Line Number" Binding="{Binding Path = Element[ProductItem.LineNumber].Value}" />
</DataGrid.Columns>

我正在动态加载xml文件

        var productList = XElement.Load(FileName);
        this.dataGrid.DataContext = productList;

1 个答案:

答案 0 :(得分:1)

不幸的是,我没有很多使用XElement的经验,但是可以使用序列化程序。 .NET,XMLSerializer和DataContractSerializer中都有两种(都是基于XML的)。我通常使用DataContractSerializer,虽然原理在另一个中是相同的。

要使用它,首先将数据类标记为DataContracts:

[DataContract]
public class PurchaseOrderLine {
    [DataMember]
    public ProductItem productItem { get; set; }}

[DataContract]
public class ProductItem{
    [DataMember]
    public int LineNumber { get; set; }}

然后,只需使用序列化程序填充列表:

using FileStream fs = new FileStream(fileName,
            FileMode.Open))
{
    DataContractSerializer ser = new DataContractSerializer(typeof(List<PurchasOrderLine>));

    List<PurchasOrderLine> productList=
                (List<PurchasOrderLine>)ser.ReadObject(fs);

    this.dataGrid.DataContext = productList;
}

然后你就像它们只是常规对象一样绑定:

<DataGrid AutoGenerateColumns="False" Name="dataGrid" ItemsSource="{Binding Path=PurchaseOrderLine}" Height="214" Width="657">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Line Number" Binding="{Binding Path=productItem.LineNumber.Value}" />
</DataGrid.Columns>

请注意,我会将DataGrid的itemsource绑定到&#34; productList&#34; (作为VM的公共属性公开)而不是您的DataContext集,因此如果此代码不起作用,您可以尝试。

祝你好运,如果我能纠正或澄清任何事情,请告诉我!