2013-06-27 22 views
0

我有一個影院列表,我從應用程序創建了一個輔助磁貼,以直接導航到特定的影院。我通過劇院的id在查詢字符串:來自磁貼錯誤的Windows Phone鏈接

我加載從WCF服務劇院在文件「MainViewModel.cs」

在我的主頁,我有劇院的名單,我可以瀏覽到詳細信息頁面。

但是,當我想從瓦導航,我有一個錯誤...

磁磚:

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

我TheaterDetails頁:

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; 
    } 

回答

0

於是,我找到了解決辦法,這要歸功於Servy在這個崗位:Using async/await with void method

我設法利用異步/ AWAIT加載數據。

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; 


    } 

而且在我的網頁:

我換成我LoadData()方法

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

您應該檢查哪些變量實際上是空。在這種情況下,它看起來是Theaters(否則錯誤會在之前拋出)。

由於Theaters從網絡填充稱之爲是最有可能被異步調用,換句話說,當你從LoadData()返回數據還沒有出現(它仍然在等待網絡電話回來),並正在等待爲Web服務返回其值。

可能的解決方案:

  1. 讓LoadData()的函數async,然後用await LoadData()。這可能需要一些重寫/重構以適合async模式(一般介紹asynchere,而具體到Windows Phone上here網絡電話)
  2. 這樣做,不涉及黑客的一個巧妙的辦法(如循環直到數據在那裏)是在數據實際填充時引發自定義事件,然後在該事件中進行Tile導航處理。有一個基本的例子here
+0

坦克你非常多的答案,我編輯我的問題,你能不能幫我用異步/等待的方法?我不知道該怎麼做,因爲這是一個無效的方法 – user2157493