1

ここで OnNavigatedTo メソッドに関連する多くの質問を見てきましたが、「どの時点でデータをロードする必要があるか」という基本的な質問に答えているものはないようです。私が知る限り、MSDN のドキュメントはこの質問に明示的に答えていません。

ローカル データベースからデータのリストをロードする必要がある場合、どの方法を使用するのが最も適切ですか? OnNavigatedTo メソッドまたは Loaded イベントを使用する必要がありますか?

私がこれまで使ってきたのはこのパターンで、うまくいくようです:

protected override void OnNavigatedTo(NavigationEventArgs e) {
   base.OnNavigatedTo(e);

   if (NavigationMode.New == e.NavigationMode) {
      var data = LoadData();
      this.DataContext = data;
   }
}

これが意味することは、ページの新しいインスタンスの場合、データを同期的にロードするということです。これは、データの読み込みが終了し、プロファイラーが UI スレッド時間を使いすぎていると報告するまで、ページがレンダリングされないことも意味します。

別のアプローチは次のパターンです。

protected override async void OnNavigatedTo(NavigationEventArgs e) {
   base.OnNavigatedTo(e);

   if (NavigationMode.New == e.NavigationMode) {
      var data = await LoadData();
      this.DataContext = data;
   }
}

しかし、このパターンでは、データをロードして DataContext を設定する前に、ナビゲーション、つまりページのレンダリングが発生する可能性があるように思えます。つまり、不要な再描画などです。

4

2 に答える 2

3

私は通常、XAML で ViewModel に直接バインドします。次に、OnNavigatedTo で、ビュー モデルをトリガーしてデータを非同期にフェッチします。

これにより、最初から基本的な値 (ページ タイトルなど) を表示できます。次に、データのフェッチを開始すると、ViewModel でプログレスバーを直接アクティブにして、データがフェッチされたら削除することもできます。

于 2013-05-16T06:31:19.913 に答える
1

データを非同期でロードすることをお勧めします。OnNavigatedToロードを開始できる 1 つの場所です。ユーザーがほぼ確実に移動するページについて話している場合は、より早く読み込みを開始できる可能性があります。

私は、従来の OOP との摩擦について考察する一連のブログ投稿を行っています。非同期構築(非同期初期化のセクション) や非同期プロパティasync(データ バインディングのセクション) など、特にデータ バインディングに注目した投稿がいくつかあります。

ほんの数時間前、私は AsyncEx ライブラリの最初の安定版リリースを発表しました。これには、非同期読み込み操作を開始し、完了時にビューを (データ バインディングを介して) 自動的に応答させるために使用できるNotifyTaskCompletion型が含まれています。

しかし、核心の問題に戻りましょう。データのロード中に何かを表示する必要があります。これを「不必要」と考えるのではなく、より良いユーザー エクスペリエンスを提供する機会として受け入れることをお勧めします。低速の電話でアプリをどのように表示するか、またはデータの読み込み中にエラーが発生した場合について考えてください。I/O があるときはいつでも、「Loading...」と「Error」の状態、および「Loaded」の状態を設計します。

于 2013-05-15T18:56:17.167 に答える