2012-02-14 14 views
1

したがって、私はwp7用のアプリケーションを作っています。それをシンプルに保つために 、これらは私のファイルは、以下のとおりです。Wp7、C#viewModelでダウンロードが完了したらナビゲート

  • LoginPage.xaml(starupページ)
  • MainPage.xamlを
  • MainViewModel.cs
  • ItemViewModel.cs

では、 MainViewModel.cs私はfolowing関数を含んでいた:

private void DownloadItems() 
    { 
     string key = this.User.Key; 
     WebClient wc = new WebClient(); 
     wc.DownloadStringCompleted += callback; 
     wc.DownloadStringAsync(new Uri("http://localhost/items?key=" + key)); //JSON 
    } 

とコールバック関数:ログインユーザがログインが処理され、すべてがOKの場合DownloadItemsがたて設定User.Keyを使用していると呼ばれる

private void callback(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      List<ItemViewModel> col = Deserialize_ItemViewModel(e.Result); // deserialize JSON to List<ItemViewModel> 
      this.Items = new ObservableCollection<ItemViewModel>(col); 
      ItemDB.Sponsors.InsertAllOnSubmit(col); 
      ItemDB.SubmitChanges(); 
      this.IsDataLoaded = true; 
      // ??? 
     } 
    } 

私が必要とするのは、ダウンロード中にProgressIndicatorを表示することです。ダウンロードが完了して処理されると、その時点までに準備が整うMainPage.xamlに移動します。

私は誰でも助けてくれることを祈っています。ありがとうございました!

答えて

0

私はそれを別の方法で解決しようと考えています。あなたのLoginPageはログインを処理するだけで、メインページにリダイレクトされます。

メインページでは、Loadingという名前のboolプロパティを作成します。このプロパティは、非同期呼び出し時にtrueに設定できます。これをプログレスバーの可視プロパティにバインドして、Loadingがtrueのときに表示します。コンバータを使用してbool - > visibleを処理します。データがロードされると、Loadingをfalseに設定するだけで、プログレスバーは消えます。同時に、コントロール/ビューのvisibleプロパティをLoadingにバインドしますが、これはプログレスバーのコンバータの反転値である別のコンバータを使用します。

希望は役立ちます。

更新日:私はあなたがすでにIsDataLoadedを持っていることを忘れました、それはあなたのビューモデルにありますか?そして、あなたがでDispatcherを使用し、あなたはどの非同期でUIを更新するときhttp://dotnetbyexample.blogspot.com/2010/11/converter-for-showinghiding-silverlight.html

+0

私のアプリではうまくいくと思いますが、私のビューモデルから非静的関数(ナビゲーション関数)を呼び出すことができるのか、この変数が更新されたのか分かりますか? – Qurben

+0

バックグラウンドスレッドからUIスレッドを呼び出す方法については、Pavanによる他の回答を参照してください。しかし、私があなたのために提供したソリューションを使用するなら、あなたが必要とは思わない。 –

+0

@Qurben、あなたはビューモデルでそれを行うべきではありません。つまり、ナビゲーション機能を呼び出すべきです。ビューモデルはナビゲーションとは関係ありません。ビューのモデルです。 viewmodelは、変更されたプロパティに通知するだけで、何かが周囲に変化したことを通知し、その変更に応じて周囲に影響を及ぼします。最良のフローはおそらく次のとおりです。ページに移動し、データがロードされるまで一時的な表示を表示します。データがロードされると、予想されるビューが表示されます。 –

0

Visibility="{Binding IsDownloading, Converter={StaticResource VisibilityConverter}, ConverterParameter=Visible}" 

例のコードはから取られます。そして、それは好きで使用

public class VisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
       CultureInfo culture) 
    { 
     if (value != null && value is bool && parameter != null) 
     { 
      var bValue = (bool) value; 
      var visibility = (Visibility)Enum.Parse(
      typeof (Visibility), parameter.ToString(),true); 
      if (bValue) return visibility; 
      return visibility == 
      Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
        CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

:コンバータは次のようになります次のように

Dispatcher.BeginInvoke(delegate 

{ 

NavigationService.Navigate(new Uri("/Folder/pagename.xaml", UriKind.Relative)); 

}); 

私はそれがあなたに交渉すると思います。

+0

私はページ自体のコールバック関数からそれを行うことができますが、私はviewmodelからDispatcherを使用することはできません。私はそれがはるかに簡単なので、私はすべての非同期のものをページに移動すると思う。 – Qurben

関連する問題