【发布时间】:2023-03-10 05:07:01
【问题描述】:
我的应用程序的主窗口上有一个属性,该属性由在后台运行的函数 (DoWork) 更新。 BackgroundWorker 在 ViewModel 中实现。如果我打开一个新页面并返回主窗口,则此属性会自动采用其在 ViewModel 构造函数中初始化的默认值。 即使打开了新窗口,我应该怎么做才能保持此属性更新?
public class ImageViewModel : INotifyPropertyChanged
{
private string currentData;
public ImageViewModel()
{
img = new ImageFile { path = "" };
currentData = "There is currently no update";
this.worker = new BackgroundWorker();
this.worker.DoWork += this.DoWork;
this.worker.ProgressChanged += this.ProgressChanged;
this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_Completed);
this.worker.WorkerReportsProgress = true;
}
public string CurrentData
{
get { return this.currentData; }
private set
{
if (this.currentData != value)
{
this.currentData = value;
this.RaisePropertyChanged("CurrentData");
}
}
}
...
private void DoWork(object sender, DoWorkEventArgs e)
{
...
this.CurrentData = "file X is being updated...";
...
}
void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
this.CurrentData = "There is currently no update...";
}
【问题讨论】:
-
您需要使用
Dispatcher.CurrentDispatcher.Invoke(() => { this.CurrentData = "";});在此处查看有关调度程序的信息:stackoverflow.com/questions/1644079/… -
所有的 Windows 都使用相同的 ViewModel 吗?
-
顺便说一句。你在哪里打电话
worker.RunWorkerAsync()?它是丢失还是只是未包含在您的示例中? -
我猜你没有启动你的工人。否则,在从后台线程更新 UI 线程上的属性时会出现一些异常。 => 查看第一条评论!
-
我的窗口使用相同的 ViewModel,但是当我返回主窗口时,总是会打开一个新的 viewmodel 实例。如何为视图模型创建单例类?
标签: c# wpf mvvm backgroundworker