Приложение Silverlight WP7 не отображает содержимое XML - PullRequest
0 голосов
/ 10 ноября 2010

Я пытаюсь получить доступ к онлайн-файлу XML и отобразить его содержимое в приложении Windows Phone 7 Silverlight.Я не получаю ошибок, но при эмуляции содержимое файла не отображается.Из того, что я собрал в Интернете, я просто называю вещи не по порядку.Я просто не уверен, что.

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 ]

1 голос
/ 10 ноября 2010

Я думаю, что ваша проблема в том, что обратный вызов из DownloadStringCompleted выполняется в потоке, отличном от потока пользовательского интерфейса. Listbox либо просто игнорирует вас, либо выдает исключение, которое проглатывается вызывающим потоком.

Перед назначением свойства itemssource необходимо переключиться на поток пользовательского интерфейса.

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

То же самое относится к присваиванию любому свойству, которое привязано к элементу пользовательского интерфейса

0 голосов
/ 11 ноября 2010

Вы убедились, что список заполняется? Установите точку останова перед привязкой к 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;

(код отредактирован вручную для использования ваших имен переменных - не проверено).

0 голосов
/ 10 ноября 2010

Если вы выясните, как это работает в другом порядке, мне было бы очень интересно увидеть это.Мне пришлось добавить много накладных расходов, чтобы все заработало.То, как я заставил его работать, - это мой класс данных (ваша rosterviewmodel), унаследованный от INotifyPropertyChanged, и все это подразумевает.При инициализации моего объекта данных я устанавливаю обработчик для события changeloaded моего объекта данных.Затем в обработчике вы должны установить DataContext для вашей стековой панели на объект, который был только что изменен.

...