C# WPF-UI未从命令更新
执行命令时,我的UI没有更新,这是一个问题 我有一个不确定的ProgressBar,它的可见性绑定到ViewModel中的IsBusyIndicator属性。命令现在应该执行一个方法,并在计算时显示ProgressBar,如下面的代码片段所示。然而,这并不像我预期的那样有效。属性设置为正确的值,但UI不会更新以显示ProgressBar 如果我只是将IsBusyIndicator设置为true,而不在命令中执行任何其他操作,那么INotifyPropertyChanged和绑定就可以正常工作C# WPF-UI未从命令更新,c#,.net,wpf,mvvm,data-binding,C#,.net,Wpf,Mvvm,Data Binding,执行命令时,我的UI没有更新,这是一个问题 我有一个不确定的ProgressBar,它的可见性绑定到ViewModel中的IsBusyIndicator属性。命令现在应该执行一个方法,并在计算时显示ProgressBar,如下面的代码片段所示。然而,这并不像我预期的那样有效。属性设置为正确的值,但UI不会更新以显示ProgressBar 如果我只是将IsBusyIndicator设置为true,而不在命令中执行任何其他操作,那么INotifyPropertyChanged和绑定就可以正常工作 v
void CommandExecute()
{
IsBusyIndicator = true;
// Do stuff that takes long
IsBusyIndicator = false;
}
在我看来,UI似乎在更新视图之前等待命令完成。有没有办法强制用户界面立即更新
提前感谢,愿原力与您同在。您可以尝试以下方法:
private async void CommandExecute()
{
IsBusyIndicator = true;
await Task.Run(() => DoWork());
IsBusyIndicator = false;
}
这使得
DoWork()
在单独的线程上运行。通常,应该避免使用async void
方法,但是如果它们正在处理UI事件,它们就可以了。正如其他人在这里所说的,它不起作用,因为您可能正在UI线程上工作
以下是技术资料:
当引发INotifyPropertyChanged的PropertyChanged时,绑定通过使用BeginInvoke
在调度程序中调用处理程序来调度处理程序,而不是立即调用
由于UI线程仍在运行长操作,因此处理属性更改仍在调度程序队列中等待。
这就是为什么只有在命令完成时才会发生更改。需要很长时间的工作应该在不同的线程上执行,以便UI线程可以自由地更新UI。你能显示需要很长时间的代码吗?理想情况下,它应该是异步代码“需要很长时间的代码”只是后端的一个方法调用。现在代码是同步运行的,但想法是在不久的将来使其异步。我只是在寻找一个临时解决方案,不过还是要谢谢你。@BenJey,只要
CommandExecute()
方法在UI线程上运行,你就不能这样做<代码>//执行需要很长时间的操作应该在另一个线程上运行。