2017-05-12 10 views
0

バインドされたプロパティが変更されたときに非同期データを読み込む最良の方法がわかりません。プロパティ設定ツールから非同期データを読み込む

私はListViewを持っており、アイテムが選択されたときに詳細なデータで新しいコンテンツを表示します。詳細項目は、非同期メソッドから取得されます。

データ方法:

private async void ShowDetailAsync() 
{ 
    if (SelectedItem?.Id != null) 
    { 
    detailViewModel.Item = await storage.GetDetailItemAsync(SelectedItem.Id); 
    } 
    else 
    { 
    detailViewModel.Item = null; 
    } 
}  

のViewModelプロパティ:

public GearItemListViewModel SelectedItem 
{ 
    get => selectedItem; 
    set { this.SetValue(ref selectedItem, value); ShowDetailAsync(); } 
} 

今ではファイア・アンド・フォーゲット非同期メソッドとして動作しますが、どのように危険なしにそれをロードするための最良の方法だろうユーザーがリストビュー内のレコードをすばやくブラウズすると、非同期化されたビューとデータが表示されます(最初のクリックでは、レコードの読み込みに時間がかかります)。

プロパティーセッターで非同期呼び出しなしで詳細項目を切り替えてロードする方法がありますか?

+2

Stephen Clearyのブログ(https://blog.stephencleary.com/2013/01/async-oop-3-properties.html)と彼の[雑誌で投稿](https: /msdn.microsoft.com/en-us/magazine/dn605875.aspx)。 – Romasz

答えて

2

私はMSDN article on async data bindingに記載されている "非同期プロパティ"アプローチを使用します。この場合

、あなたのdetailViewModel.ItemプロパティはTItemからNotifyTask<TItem>にタイプを変更します、そして、あなたのShowDetailAsyncは、次のようになります。メソッドが同期していることを

private void ShowDetail() 
{ 
    if (SelectedItem?.Id != null) 
    { 
    detailViewModel.Item = NotifyTask.Create(storage.GetDetailItemAsync(SelectedItem.Id); 
    } 
    else 
    { 
    detailViewModel.Item = null; 
    } 
} 

注意。非同期操作を同期的に開始します。

この変更では、データバインディングをの代わりにItem.Resultという参照に更新する必要があります。スピナー/ローディングインジケーターを表示する場合はItem.IsNotCompleted、エラーを通知する場合はItem.IsFaultedなどの他のプロパティーにデータをバインドできます(以前のasync voidアプローチでは、UIスレッドで直接エラーが発生します)。

+0

ありがとうございます。私はどのように空のviewmodel(非同期サービスメソッドから来ていない)を割り当てるでしょうか? これは問題ありませんか? detailViewModel.Item = new NotifyTaskCompletion (Task.Factory.StartNew(()=> new GearItemDetailViewModel())); 以上Task.FromResult(new GearItemDetailViewModel()); –

+0

それから 'FromResult'を使用してください。しかし、それをする必要があるのはかなり奇妙です。 –

+0

誰も{x:Bind}で試してみましたか?静的な双方向バインディングを使用すると、ターゲットテキストボックスを残してソースが更新されているときにnull参照例外が発生します。 Itemに新しいNotifyTaskが割り当てられているため、Resultがnullであり、その後バインドシステムがソース(ViewModel.Item.Result ...)を更新しようとします。動的バインディングは正常に動作します。 –

関連する問題