我有一个类似下面的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;
答案 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集,因此如果此代码不起作用,您可以尝试。
祝你好运,如果我能纠正或澄清任何事情,请告诉我!