実際にINotifyPropertyChanged.PropertyChanged
は、UI同期コンテキストで発生したことがデータバインディングに必要です。
async
/プロパティ(現在の状態を表し、常に同期している)とコマンド(アクションを表し、同期または非同期の場合があります)をawait
区別するように強制します。プロパティのゲッターとセッターはできません。そのため、「非同期セット」を使用したサンプルコードは可能なアプローチではありません。async
async
非同期コマンドを有効にします。コマンドバインディングを使用して、ルーティングされたコマンドを非同期的に処理したり、async
デリゲートをに渡しDelegateCommand
たり、独自のICommand
実装を使用したりできます。どちらの方法でも、async void
コマンドイベントハンドラーができあがります。
現実的な例は、VMプロパティでMプロパティをメモリ内に設定SaveCommand
し、async
ハンドラーを使用することです。コマンドの進行中にUIが適切に応答できるように(通常は少なくともreturnを発生させる)、ハンドラーが追加のVMプロパティ(または他のハンドラーと共有される共通のasync
プロパティ)と対話するのが一般的です。SaveInProgress
Busy
async
CanExecute
false
したがって、async
ハンドラーは次のようになります。
private async void SaveCommandExecute()
{
try
{
// Set VM property; updates View appropriately.
Busy = true;
// Do the actual saving asynchronously.
await Model.SaveAsync();
}
catch (Exception ex)
{
// Update the VM with error information.
Error = ex.Message;
}
finally
{
// Let the VM know we're done.
Busy = false;
}
}
private void SaveCommandCanExecute()
{
return !Busy;
}
VMプロパティ(Error
およびBusy
)は、キャプチャされたUI同期コンテキストで更新されることに注意してください。
これは、async
MVVMの中心的な概念を示しています。コマンドはである可能性がありますasync
が、プロパティ(などBusy
)は常に現在の状態を表します。
既存のMVVMアプリに追加する場合はasync
、ビジネスを示すいくつかの追加のプロパティがあり、場合によっては更新の進行状況(完了率など)も表示されます。アプリケーションによっては、同時に複数の非同期操作を許可する場合があります。この情報をビューに追加するための良い方法を考える必要があります。async
これはMVVMアプリの中で最も難しい部分だと思います。