Ссылка на Windows Phone из-за ошибки плитки

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

Я загружаю кинотеатры из службы WCF в файл «MainViewModel.cs».

На моей домашней странице есть список кинотеатров, и я могу перейти на страницу сведений.

Но когда я хочу перейти с плитки, у меня возникает ошибка...

Плитка:

ShellTile.Create(new Uri("/TheaterDetails.xaml?selectedItem=" + theater.idTheater, UriKind.Relative), tile, false);

Страница моего кинотеатра:

 public partial class TheaterDetails : PhoneApplicationPage
{

    theater theater = new theater();



    public TheaterDetails()
    {
        InitializeComponent();

    }


    protected override void OnNavigatedTo(NavigationEventArgs e)
    {

        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();

        }


        if (DataContext == null)
        {

            string selectedIndex = "";
            if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex))
            {
                int index = int.Parse(selectedIndex);

                    theater = (from t in App.ViewModel.Theaters
                               where t.idTheater == index
                               select t).SingleOrDefault();

                    DataContext = theater;

....
....
....

Ошибка :

https://dl.dropboxusercontent.com/u/9197067/error.png

Как если бы данные не были загружены...

У вас есть идея, откуда взялась проблема?

Решение может быть простым, но я новичок... Может быть, это потому, что я загружаю данные асинхронно, и приложение не ждет, пока это будет сделано...

Спасибо

РЕДАКТИРОВАТЬ :

Мой метод LoadData():

 public void LoadData()
    {

        client.GetTheatersCompleted += new EventHandler<ServiceReference1.GetTheatersCompletedEventArgs>(client_GetTheatersCompleted);
        client.GetTheatersAsync();

 // Other get methods...

        this.IsDataLoaded = true;
        }


private void client_GetTheatersCompleted(object sender,       ServiceReference1.GetTheatersCompletedEventArgs e)
    {
        Theaters = e.Result;
    }

person user2157493    schedule 27.06.2013    source источник


Ответы (2)


Вы должны проверить, какая переменная на самом деле равна нулю. В данном случае это выглядит как Theaters (иначе ошибка возникла бы раньше).

Поскольку Theaters заполняется из веб-вызова, он, скорее всего, вызывается асинхронно, другими словами, когда вы возвращаетесь из LoadData(), данных еще нет (он все еще ожидает возврата веб-вызова) и ожидает веб-службы. вернуть его значения.

Возможные решения:

  1. Сделайте LoadData() функцией async, а затем используйте await LoadData(). Это может потребовать небольшого переписывания/рефакторинга, чтобы соответствовать шаблону async (общее введение в async здесь и специально для веб-вызовов на Windows Phone здесь)
  2. Аккуратный способ сделать это, не связанный с хаками (например, зацикливанием до тех пор, пока данные не появятся), состоит в том, чтобы вызвать пользовательское событие, когда данные фактически заполнены, а затем выполнить обработку навигации по плитке в этом событии. Базовый пример здесь.
person Oren    schedule 27.06.2013
comment
Большое спасибо за ответ, я отредактировал свой вопрос, не могли бы вы помочь мне использовать метод async/await, пожалуйста? Я не знаю, как это сделать, потому что это метод void - person user2157493; 27.06.2013

Итак, решение, которое я нашел благодаря Servy в этом сообщении: Использование async/await с void метод

Мне удалось использовать async/await для загрузки данных.

Я заменил свой метод LoadData() на:

    public static Task<ObservableCollection<theater>> WhenGetTheaters(ServiceClient client)
    {
        var tcs = new TaskCompletionSource<ObservableCollection<theater>>();
        EventHandler<ServiceReference1.GetTheatersCompletedEventArgs> handler = null;
        handler = (obj, args) =>
        {
            tcs.SetResult(args.Result);
            client.GetTheatersCompleted -= handler;
        };
        client.GetTheatersCompleted += handler;
        client.GetTheatersAsync();
        return tcs.Task;
    }



    public async Task LoadData()
    {

        var theatersTask = WhenGetTheaters(client);
        Theaters = await theatersTask;


        IsDataLoaded = true;


    }

И на моей странице:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        if (!App.ViewModel.IsDataLoaded)
        {
           await App.ViewModel.LoadData();
        }
person user2157493    schedule 27.06.2013