ユーザー データをリモート Web サービスと同期するバックグラウンド操作を長時間実行しており、その操作の状態についてユーザーにフィードバックを提供したいと考えています。SystemTray ProgressIndicator は、XAML で次のように ViewModel のプロパティにバインドされます。
<shell:SystemTray.ProgressIndicator>
<shell:ProgressIndicator IsVisible="{Binding IsSynchronizing, Mode=OneWay}"
Text="Synchronizing..."
Value="{Binding SyncProgress, Mode=OneWay}" />
</shell:SystemTray.ProgressIndicator>
ここでのバインディングは、呼び出しの開始時に正しく機能します。非同期 Web サービス操作は ViewModel から呼び出され、コールバックを提供して、操作の現在のステータスに基づいてプロパティの値を設定します。
RemoteServiceManager.Current.UpdateUserDataAsync((progress) =>
{
// Marshal to UI thread
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
IsSynchronizing = !progress.OperationFinished;
SyncProgress = progress.PercentComplete;
if (progress.OperationFinished)
{
OnDataChanged();
}
});
});
このアプローチの問題点は、UI ディスパッチャーがアクションを呼び出さないように見える (セッターが呼び出されない) ことです。ディスパッチャーへの呼び出しを削除してデリゲート内のコードを直接実行すると、コードは例外を生成せずに実行されますが、プログレス インジケーターのバインドされたプロパティは、新しいプログレス値で更新されません。この長時間実行される非同期操作から ProgressInidcator Value プロパティを適切に更新するにはどうすればよいですか?
もう 1 つの簡単な最後の質問: ProgressIndicator に設定する値は 0 ~ 1 または 0 ~ 100 の範囲にする必要がありますか?