[英]Silverlight WP7 App Not Displaying XML Contents
我正在嘗試訪問在線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>
當然,任何建議都將不勝感激。 謝謝大家的幫助!
我認為您的問題是,DownloadStringCompleted的回調是在UI線程以外的線程上執行的。 列表框要么無視您,要么拋出被調用線程吞沒的異常。
在分配itemssource屬性之前,您需要切換到UI線程。
Dispatcher.Current.BeginInvoke((Action)(()=>rosterList.ItemsSource = list));
分配給與UI元素進行數據綁定的任何屬性也是如此
如果您弄清楚它是如何工作的,我將非常感興趣。 我必須增加很多開銷才能使其正常運行。 我使用它的方式是從INotifyPropertyChanged繼承的數據類(您的rosterviewmodel)及其所包含的所有內容。 初始化數據對象時,我為數據對象的propertychanged事件設置了處理程序。 然后,在處理程序中,您要做的是將堆棧面板的DataContext設置為剛剛更改的對象。
您是否已確認正在填充列表? 在綁定到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名稱手動編輯的代碼-未測試)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.