我有一个简单的 bool 绑定到 ProgressRing IsActive 属性。该属性位于 ViewModel 基类中。这是代码:
<!--XAML-->
<ProgressRing
x:Name="RestrictAppProgress"
Margin="10"
IsActive="{x:Bind _vm.ProgressRingActive, Mode=OneWay}" Width="30" Height="30"
Foreground="#FF9333"/>
// ViewModel base class
private bool _progressRingActive;
public bool ProgressRingActive
{
get => _progressRingActive;
set
{
_progressRingActive = value;
Set(() => ProgressRingActive, ref _progressRingActive, value);
}
}
// ViewModel
public override async Task InitViewModel(ClassState classState)
{
ProgressRingActive = true;
_restrictModel = new RestrictAppModel();
var success = await _restrictModel.LoadAppsFromServer().ConfigureAwait(true);
ProgressRingActive = false;
}
// Code-behind OnNavigatedTo from Page class
protected override async void OnNavigatedTo(NavigationEventArgs restrictArgs)
{
...
await _vm.InitViewModel(state.classState).ConfigureAwait(true);
}
// Model class method that makes an await call
public async Task<bool> LoadAppsFromServer()
{
try
{
var appsListJson = await service.GetAppList(Settings.TeacherDistrictId).ConfigureAwait(true);
...
}
catch (ApiException ex)
{
...
return false;
}
return true;
}
因此,当页面加载并转到 时OnNavigatedTo
,我的理解是我们仍然处于 UI 上下文中。当我们到达await _vm.InitViewModel(state.classState).ConfigureAwait(true);
in 时OnNavigatedTo
,我的理解是因为这个调用是等待的,所以 InitViewModel 不会发生在 UI Context 中,所以当绑定ProgressRingActive
的属性发生变化时,不会在 UI 线程上触发属性更改,因此不会进行任何更改。这是正确的吗?
我之前尝试摆脱 await 调用_vm.InitViewModel
,认为它会进入 UI 上下文中的方法,如果我删除vm.InitViewModel
调用时的等待,不在ProgressRingActive = true;
UI 上下文中进行,那么调用将var success = await _restrictModel.LoadAppsFromServer().ConfigureAwait(true);
在不同的上下文中编组,一旦它返回,我们又回到了 UI 上下文,并ProgressRingActive = false;
在 UI 上下文中创建?我不是百分百确定。
到目前为止唯一有效的是Bindings.Update()
在方法结束时调用OnNavigatedTo
。