2014-02-12 303 views
-2

我有一个XML文件,如下所示。我计划将XML文件的内容绑定到WPF中的Datagrid。WPF,XML 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

你有没有在你的第二个结合(即“productItem”)尝试小写“ProductItem”? XAML对我的回忆是大小写敏感的。在输出窗口中是否有任何System.Data异常? – BradleyDotNET

+0

@ LordTakkera,它是访问像ProductItem.LineNumber这样的元素的正确方法。因为我也尝试过productItem.LineNumber。它不起作用 – RobinAtTech

+0

通常这就是你会做的(用小写字母给你的属性名称)。我不确定为什么它会读取任何不同的XML文档。你有没有尝试从第二个绑定中删除“元素”?如果该对象已经是数据上下文,那么它可能不再是XElement,因此不需要这部分。 System.Data例外可以帮助你在这里指导你。 – BradleyDotNET

回答

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绑定到“productList “(作为VM的公共属性公开)而不是DataContext集,因此如果此代码不起作用,您可以尝试。

祝你好运,让我知道,如果我可以纠正或澄清什么!