Silverlight WP7应用程序不显示XML内容

时间:2010-11-10 18:12:20

标签: xml silverlight windows-phone-7 webclient

我正在尝试访问在线XML文件并在Windows Phone 7 Silverlight应用程序中显示其内容。我没有收到任何错误,但是在模拟时,XML文件中没有显示任何内容。从我在网上收集的内容来看,我只是简单地把事情搞砸了。我只是不确定是什么。

MainPage.xaml.cs中:

namespace TwitterMix
{
public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }


    private void GetRoster()
    {
        WebClient rstr = new WebClient();

        rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted);
        rstr.DownloadStringAsync(new Uri("http://www.danfess.com/data.xml"));
    }

    void roster_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlPersons = XElement.Parse(e.Result);

        var list = new List<RosterViewModel>();

        foreach (XElement person in xmlPersons.Elements("person"))
        {
            var name = person.Element("name").Value;
            var age = person.Element("age").Value;


            list.Add(new RosterViewModel
            {
                Name = name,
                Age = age,
            });
        }

        rosterList.ItemsSource = list;
    }


    public class RosterViewModel
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }


}
}

MainPage.xaml中:

<Grid x:Name="ContentPanel" Grid.Row="1">
        <ListBox HorizontalAlignment="Left" Name="rosterList" VerticalAlignment="Top" Width="468" Height="600">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Height="132">
                        <StackPanel Width="370">
                            <TextBlock Text="{Binding Name}" Foreground="White" FontSize="28" />
                            <TextBlock Text="{Binding Age}" TextWrapping="Wrap" FontSize="24" Foreground="White" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

最后是XML文件的内容:

<?xml version="1.0" encoding="utf-8" ?>

<roster>

<person>
<name>Blake</name>
<age>25</age>
</person>

<person>
<name>Jane</name>
<age>29</age>
</person>

<person>
<name>Bryce</name>
<age>29</age>
</person>

<person>
<name>Colin</name>
<age>29</age>
</person>

</roster>

当然,非常感谢任何建议或建议。谢谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

我认为你的问题是来自DownloadStringCompleted的回调是在UI线程以外的线程上执行的。列表框要么忽略你,要么抛出一个被调用线程吞噬的异常。

在分配itemssource属性之前,您需要切换到UI线程。

Dispatcher.Current.BeginInvoke((Action)(()=>rosterList.ItemsSource = list));

分配给任何数据绑定到UI元素的属性

也是如此

答案 1 :(得分:0)

如果你弄清楚它是如何以不同的顺序工作的,我会非常有兴趣看到它。我不得不增加很多开销才能实现目标。我让它工作的方式是我的数据类(你的rosterviewmodel)继承自INotifyPropertyChanged和所有这意味着。初始化我的数据对象时,我在数据对象的propertychanged事件上设置了一个处理程序。然后在处理程序中,您要做的是将stackpanel的DataContext设置为刚刚更改的对象。

答案 2 :(得分:0)

您是否确认正在填充列表?在绑定到rosterList之前设置断点并检查list.Count。

您可以像

一样加载xml
    XDocument xmlPersons = XDocument.Load(e.Result);

    var list = from query in xmlPersons.Descendants("person")
                    select new RosterViewModel
                    {
                        Name = (string)query.Element("name"),
                        Age = (int)query.Element("age")
                    };


    rosterList.ItemsSource = list;

(手动编辑代码以使用您的var名称 - 未经测试)。