【问题标题】:WPF, XML Datagrid BindingWPF、XML 数据网格绑定
【发布时间】:2014-02-12 22:32:26
【问题描述】:

我有一个类似于下面的 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;

【问题讨论】:

  • 您是否在第二个绑定中尝试过小写“ProductItem”(即“productItem”)?我记得 XAML 是区分大小写的。您在输出窗口中是否收到任何 System.Data 异常?
  • @LordTakkera,访问 ProductItem.LineNumber 等元素是否正确。因为我也尝试过 productItem.LineNumber 。它不工作
  • 通常你会这样做(使用小写字母给你的属性名称)。我不确定为什么读取 XML 文档会有任何不同。您是否尝试过从第二个绑定中删除“元素”?如果对象已经是数据上下文,它可能不再是 XElement,因此不需要这块。 System.Data 异常可以在这里为您提供指导。
  • @LordTakkera 想知道也不例外。还有其他方法可以绑定xml文件吗?
  • 您总是可以反序列化(而不是使用 XElement)。如果您可以接受该解决方案,我可以发布一个示例作为答案。

标签: xml wpf datagrid wpfdatagrid


【解决方案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 集,因此如果此代码不起作用,您可以尝试一下。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2011-08-15
    相关资源
    最近更新 更多