WPF - 命令导致界面未更新

6
我有一个问题,当执行命令时我的UI不会更新。我有一个不确定的ProgressBar,其可见性绑定到ViewModel中的IsBusyIndicator属性。一个 Command 应该执行一个方法并在计算过程中显示 ProgressBar,如下所示的代码片段。然而,这并没有按照我的期望工作。属性被设置为正确的值,但UI没有更新以显示ProgressBar。如果我只是将IsBusyIndicator设置为true并在Command中什么也不做,那么它可以正常工作,因此INotifyPropertyChanged和Binding都可以正常工作。
void CommandExecute()
{
    IsBusyIndicator = true;
    // Do stuff that takes long
    IsBusyIndicator = false;
}

我觉得UI在更新视图之前等待命令完成。是否有一种方法可以强制UI立即更新?

提前感谢,愿原力与你同在。


那些执行时间较长的任务应该在不同的线程上执行,这样UI线程就能自由地更新UI。你能展示一下需要较长时间的代码吗?理想情况下,它应该是异步代码。 - Emond
“运行时间较长的代码”只是后端上的一个方法调用。目前该代码正在同步运行,但计划在不久的将来将其改为异步运行。我只是在寻找一个临时解决方案,但还是谢谢您的帮助。 - BenJey
@BenJey,只要CommandExecute()方法在UI线程上运行,你就不能这样做。// Do stuff that takes long应该在另一个线程上运行。 - Hasan Emrah Süngü
2个回答

3
您可以尝试以下方法:
private async void CommandExecute()
{
    IsBusyIndicator = true;
    await Task.Run(() => DoWork());
    IsBusyIndicator = false;
}

这使得DoWork()在单独的线程上运行。通常情况下,应避免使用async void方法,但如果它们处理UI事件,则可以使用。

2

正如其他人在这里所说,它不起作用,因为您可能正在UI线程上进行工作。

以下是技术细节: 当INotifyPropertyChanged的PropertyChanged被触发时,绑定通过使用BeginInvoke在调度程序中调用处理程序而不是立即执行处理程序。

由于UI线程仍在运行您的长时间操作,处理属性更改仍在等待调度程序队列。 这就是为什么只有在命令完成时才会发生更改的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接