在非常具体的场景中忽略 ViewModel 更改

ViewModel changes ignored in very specific scenario

我有一个绑定到按钮的方法,该方法非常耗时。所以我创建了一个标签并将其绑定到 属性 以通知用户应用程序实际上正在做某事。

private void Button_OnClick(object sender, RoutedEventArgs e)
{
   _viewModel.BottomBarMessage = "Loading..."; //part 1
   //do very long thing, for example
   System.Threading.Thread.Sleep(3000); //wait for 3 seconds to simulate long operation
   _viewModel.BottomBarMessage = "Done."; //part 2
}

问题是 part 1 似乎从未执行过。标签切换到 Done 但永远不会切换到 Loading。 我怀疑是因为 UI 被阻止了,但是将 Sleep 更改为作为 Task 执行没有任何改变。

使用 await Task.Delay 而不是 Thread.Sleep - 您正在阻塞 UI 线程。 类似于:

 private async void Button_OnClick(object sender, RoutedEventArgs e)
 {
    _viewModel.BottomBarMessage = "Loading..."; //part 1
    //do very long thing, for example
    await Task.Delay(3000); 
    _viewModel.BottomBarMessage = "Done."; //part 2
 }