我正在尝试访问在线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>
当然,非常感谢任何建议或建议。谢谢大家的帮助!
答案 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名称 - 未经测试)。