我有一个长期运行的后台操作,用于将用户数据与远程 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 调度程序似乎永远不会调用操作(setter 永远不会被调用),如果我删除对调度程序的调用并直接在委托中执行代码,则代码将在不生成异常的情况下执行,但是进度指示器上的绑定属性不会使用新的进度值更新。如何从此长时间运行的异步操作中正确更新 ProgressInidcator Value 属性?
最后一个简短的问题:我在 ProgressIndicator 上设置的值应该是 0-1 还是 0-100?