来自XML源代码的XAML DataBinding

时间:2012-05-27 13:11:44

标签: c# wpf windows-phone-7 xaml

这是我的XML

<?xml version="1.0" encoding="utf-8"?>
<app>
<films>
    <film name="Haha" year="2008" />
    <film name="Haha" year="2008" />
    <film name="Haha" year="2008" />
    <film name="Haha" year="2008" />
    <film name="Haha" year="2008" />
    <film name="Haha" year="2008" />
</films>
</app>

这是我的XAML

<ListBox x:Name="listBoxControl">
<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <StackPanel>
                <TextBlock Text="{Binding Path=@name}" />
                <TextBlock Text="{Binding Path=@year}" />
            </StackPanel>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

这是我的C#

XDocument xmldoc = XDocument.Load(new StringReader(result));
listBoxControl.ItemsSource = xmldoc.Descendants("film");

在过去的几个小时里,我已经搜索了互联网和Stack Overflow问题,希望能找到解决方案。我正在做的是,从我的网站异步下载一些XML数据,然后将其传递给名为“listBoxControl”的ListBox控件。问题是“文本”字段不会在其中呈现任何文本。我在Binding中使用“Path”,因为不允许使用XPath,我收到此错误:The property 'XPath' was not found in type 'Binding'

现在,我在这里做错了什么?它是C#中的WP7.1应用程序,使用在Windows 8 Consumer Preview上运行的Visual Studio Express for Windows Phone。

2 个答案:

答案 0 :(得分:1)

我只是创建一个类并绑定到它:

public class Film
{
    public string name { get; set; }
    public string year { get; set; }
}

var d = xmldoc.Descendants("film").Select(x => new Film { name = x.Attribute("name").Value, year = x.Attribute("year").Value });

<TextBlock Text="{Binding name}" />
<TextBlock Text="{Binding year}" />

编辑:或匿名类型:

var d = xmldoc.Descendants("film").Select(x => new { name = x.Attribute("name").Value, year = x.Attribute("year").Value });

<TextBlock Text="{Binding name}" />
<TextBlock Text="{Binding year}" />

答案 1 :(得分:1)

Windows Phone不支持使用XPath进行绑定。

所以解决这个问题的唯一方法是通过反序列化xml并绑定到.NET对象。

确保,如果您要允许用户更改数据或刷新您在类上实现INotifyPropertyChanged的源中的数据,以便UI通知对象中的更改。