wpfmvvm刷新视图

wpfmvvm刷新视图,wpf,mvvm,Wpf,Mvvm,我有一个使用MVVM设计属性的WPF应用程序。有一个长时间运行的过程来填充一个网格,我想为它显示一个忙碌的光标。我有部分改变光标工作。我遇到的问题是光标绑定到一个名为IsBusy的bool。当调用运行一段时间的方法时,我将IsBusy设置为true,当方法完成时,我将其设置为false 公共程序(){ IsBusy=true; …这里有长时间运行的代码 IsBusy=false; }` 我知道绑定到IsBusy的游标正在工作,因为我用另一个过程测试了它 IsBusy=!IsBusy; 这会切换

我有一个使用MVVM设计属性的WPF应用程序。有一个长时间运行的过程来填充一个网格,我想为它显示一个忙碌的光标。我有部分改变光标工作。我遇到的问题是光标绑定到一个名为IsBusy的bool。当调用运行一段时间的方法时,我将IsBusy设置为true,当方法完成时,我将其设置为false

公共程序(){
IsBusy=true;
…这里有长时间运行的代码
IsBusy=false;
}
`

我知道绑定到IsBusy的游标正在工作,因为我用另一个过程测试了它

IsBusy=!IsBusy;

这会切换光标。我遇到的问题是,当方法中的代码运行时,视图似乎没有刷新。在我将IsBusy设置为true后,是否有方法强制视图为refesh

在每个窗口应用程序中,都有一个线程专门用于处理应用程序的可视化表示。这根线是白色的。当代码响应窗口事件(例如,加载的事件或用户单击按钮)而运行时,它将在此UI线程上运行。代码运行时,UI线程正在执行您的工作,无法更新窗口的视觉表示。在极端情况下(即,您的工作需要相当长的时间才能完成),您的窗口将显示为锁定状态

如果您使用UI线程执行长时间运行的工作,那么您做得不对。您应该使用async await或使用
Task.Run()
在后台线程上执行工作

如果
LongProcedure()
是IO绑定的(比如等待来自某处的数据),那么应该使用异步等待。如果受CPU限制(大量数据处理/计算),则应使用
Task.Run()

异步等待:

public async Task LongProcedure()
{
    IsBusy = true;

    await GetDataFromSomewhereAsync();

    IsBusy = false;
}

public async void CallingMethod()
{
    ......
    await LongProcedure();
}
任务。运行:

public void LongProcedure()
{
    IsBusy = true;
    ... // long running code here
    IsBusy = false;
}
public async void CallingMethod()
{
    ......
    await Task.Run((Action) LongProcedure);
}

请注意,用户界面不能直接从后台线程更新。通常,您需要首先将更新代码封送到UI线程上。有许多不同的方法可以做到这一点,这取决于您使用的是什么类型的windows应用程序,例如,等等。

您是否在同一线程上执行长时间运行的任务?是的,我希望保持简单。该过程需要5-10秒,在运行过程中,他们无法执行任何其他操作。我想显示等待光标只是为了让用户知道发生了什么。@Pedler不幸的是,更新屏幕时需要相同的线程。当它运行其他东西时,它不能用来更新屏幕。亲爱的上帝,请向我展示典型的复制目标,如何在UI线程中工作时不阻止UI线程,赞美你的名字。阿门。。。等等,也许就是这个?我想是的。准备好投票吧,佩德勒!谢谢你的帮助。这为我指明了正确的方向。我最终使用了BackgroundWorker类。