【问题标题】:Binding to XML data in UWP在 UWP 中绑定到 XML 数据
【发布时间】:2018-05-17 19:32:57
【问题描述】:

UWP 中似乎无法绑定到 XML 数据。在 WPF 中,您可以这样做...

定义一个资源...

<XmlDataProvider x:Key="SolarSystem" XPath="SolarSystem/Planets">
    <x:XData>
        <SolarSystem xmlns="">
            <Planets>
                <Planet Name="Mercury" Type="Terrestrial"/>
                <Planet Name="Venus" Type="Terrestrial"/>
                <Planet Name="Earth" Type="Terrestrial"/>
                <Planet Name="Mars" Type="Terrestrial"/>
                <Planet Name="Jupiter" Type="Giant"/>
                <Planet Name="Saturn" Type="Giant"/>
                <Planet Name="Uranus" Type="Giant"/>
                <Planet Name="Neptune" Type="Giant"/>
                <Planet Name="Ceres" Type="Dwarf"/>
                <Planet Name="Pluto" Type="Dwarf"/>
                <Planet Name="Haumea" Type="Dwarf"/>
                <Planet Name="Makemake" Type="Dwarf"/>
                <Planet Name="Eris" Type="Dwarf"/>
            </Planets>
        </SolarSystem>
    </x:XData>
</XmlDataProvider>

将 XML 绑定到 ListView...

<ListView Name="ListView5" ItemsSource="{Binding Source={StaticResource SolarSystem},XPath=*}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding XPath=@Name}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

似乎无法在 UWP 中执行任何远程类似的操作。我可以将 XML 放入文件中,将其读入 XmlDocument ......仍然无法绑定到它。似乎无法绑定到 POCO 以外的任何东西。当然,我可以绑定到 C# 对象以外的东西。我错过了什么?

【问题讨论】:

    标签: c# xml data-binding uwp


    【解决方案1】:

    我一般是把数据放到数据表中,然后绑定到表上

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    using System.Data;
    
    namespace ConsoleApplication45
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
    
                DataTable dt = new DataTable();
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Type", typeof(string));
    
    
                XDocument doc = XDocument.Load(FILENAME);
                foreach(XElement planet in doc.Descendants("Planet"))
                {
                    dt.Rows.Add(new object[] {
                        (string)planet.Attribute("Name"),
                        (string)planet.Attribute("Type")
                    });
                }
            }
    
        }
    }
    

    【讨论】:

    • 数据表?通常? DataTable 最近才在 UWP 中可用。事实上,去年我问微软为什么 DataTable 不在 UWP 中,他们告诉我在 UWP 应用程序中没有人需要表格!
    • 数据表很容易绑定。你还想要什么对象?使用相同的技术很容易加载不同的对象。
    • 是的,DataTables 很棒。我一直在 WPF 中使用它们。但是,您实际上不是在编写数据,而是在编写代码。我认为 DataTables 不如 POCO 优雅,当然也没有 POCO 强大。想象一个有 100 个条目的表。您真的想从文件中加载。我真的想输入数据而不是代码。我会对 XML、JSON 或 CSV 感到满意。当然,您可以将 XML 加载到您的 DataTable 中,但前提是您首先从 DataTable 中编写它。我真的很难相信你不能绑定到 UWP 中的实际数据。那为什么叫“数据绑定”呢?
    • 如何编写绑定到非结构化对象的代码?特别是如果它是锯齿状的。或者一个有很多多层(递归)的对象。最容易绑定的类型对象是矩形对象。 CSV 不是一个对象,只是一种可以有标题行、可以有空单元格、可以包含空格、制表符和引号,并且可以有空单元格的格式。
    • 所有这些数据都有一个显式或隐式结构。 XML 是结构化的(用您的话来说,是锯齿状的)。 CSV(可用)具有扁平(用你的话说,矩形)结构。在 WPF 中,我可以绑定到所有这些。我开始意识到 WPF 数据绑定的丰富、强大的特性以及它的 UWP 表亲的相对贫困。刚才我已经放弃了您的 DataTable 方法,因为我无法让组标题在 LIstVIew 中工作。所以我现在将停止向上游游泳,并为我的数据编写一堆 POCO。噗噗噗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2018-04-13
    • 2019-05-08
    • 2020-07-04
    • 2017-01-29
    • 2018-05-07
    • 2016-11-26
    相关资源
    最近更新 更多