gpt4 book ai didi

wpf - 立即更新绑定(bind)的 WPF 属性

转载 作者:行者123 更新时间:2023-12-03 12:49:50 30 4
gpt4 key购买 nike

我在窗口上有一个文本框,用于报告操作的状态和/或成功。它绑定(bind)到 ViewModel 上的一个属性。

因此,当用户激活可能需要一些时间的操作时,我不想让他知道该操作已在 textBox 中开始。问题是他直到 Action 完成后才写入文本框。

我想这是因为线程没有让 UI 有机会完成它的工作,但不确定。

public class ViewModel : INotifyPropertyChanged
{
private string _report;
public string Report
{
get { return _report; }
set
{
_report = value;
RaisePropertyChanged("Report");
}
}

public void DoHeavyAction()
{
Report += "Heavy action readying";

ReadyHeavyAction();

Report += "Heavy action starting";

var result = DoTheHeavyAction();

if(!result.success)
{
report += "Heavy action failed";
return;
}

Report += result.value;
}
}

在这种情况下,程序滞后 2 秒,然后整个事情出现:
Heavy action readying
Heavy action starting
Heavy action failed

而不是一一出现。

我可以以某种方式使用调度程序来更新 View (注意我使用的是 MVVM)。

最佳答案

是的,这很容易。您的繁重操作在单独的线程中运行,您将进度报告为

Dispatcher.Invoke((Action)(() => {
Report.value = "Started";
}));

编辑:
在实际情况下,操作由 ICommand 激活。 .表示 ICommand从 UI 调度,因此它进入 UI 线程。所以问题是 UI(及其更新)被繁重的操作阻止了。

解决方案是在命令到达时启动一个新线程,并在那里完成工作。可以使用上面示例中的代码更新 UI。

该解决方案有一些替代方法,但无论如何,它们都在后台线程中启动任务,尽管是隐式的。一个受欢迎的好方法是使用 BackgroundWorker 并更新其 ProgressChanged 中的状态事件(请注意,此事件来自 UI 线程,因此在这种情况下您不需要使用 Dispatcher)。

关于wpf - 立即更新绑定(bind)的 WPF 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8135321/

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