Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-UI未从命令更新_C#_.net_Wpf_Mvvm_Data Binding - Fatal编程技术网

C# WPF-UI未从命令更新

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

执行命令时,我的UI没有更新,这是一个问题

我有一个不确定的ProgressBar,它的可见性绑定到ViewModel中的IsBusyIndicator属性。命令现在应该执行一个方法,并在计算时显示ProgressBar,如下面的代码片段所示。然而,这并不像我预期的那样有效。属性设置为正确的值,但UI不会更新以显示ProgressBar

如果我只是将IsBusyIndicator设置为true,而不在命令中执行任何其他操作,那么INotifyPropertyChanged和绑定就可以正常工作

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线程上运行,你就不能这样做<代码>//执行需要很长时间的操作应该在另一个线程上运行。