gpt4 book ai didi

WPF MVVM 刷新 View

转载 作者:行者123 更新时间:2023-12-03 10:22:31 25 4
gpt4 key购买 nike

我有一个使用 MVVM 设计属性的 WPF 应用程序。填充网格需要一个长时间运行的过程,我想为其显示一个繁忙的光标。我有改变光标工作的部分。我遇到的问题是光标绑定(bind)到一个名为 IsBusy 的 bool 值。当调用运行一段时间的方法时,我将 IsBusy 设置为 true,当方法完成时,我将其设置回 false。
public void LongProcedure(){
IsBusy=true;
... long running code here
IsBusy=false;
}
`

我知道绑定(bind)到 IsBusy 的游标正在工作,因为我使用另一个程序对其进行了测试

IsBusy=!IsBusy;

这确实会切换光标。我遇到的问题是在方法中的代码运行时 View 似乎没有刷新。将 IsBusy 设置为 true 后,有没有办法强制刷新 View ?

最佳答案

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

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

如果 LongProcedure()是 IO 绑定(bind)的(比如等待来自某个地方的数据),那么您应该使用 async-await。如果它受 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。通常,您需要首先将更新代码编码到 UI 线程上。有许多不同的方法可以做到这一点,这取决于您使用的是哪种 Windows 应用程序,例如 windows forms , WPF , ETC。

关于WPF MVVM 刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com