C# 从ViewModel更新UI线程
我试图通过使用C# 从ViewModel更新UI线程,c#,wpf,user-interface,mvvm,backgroundworker,C#,Wpf,User Interface,Mvvm,Backgroundworker,我试图通过使用BackgroundWorker在循环内部执行更新UI上进度条的简单操作。我不知道我做错了什么。非常感谢您的帮助 private void ProcessButtonClickAction(object param) { BackgroundWorker BGWUpdateUi = new BackgroundWorker(); BGWUpdateUi.ProgressChanged += (sender, args) => { Progre
BackgroundWorker
在循环内部执行更新UI上进度条的简单操作。我不知道我做错了什么。非常感谢您的帮助
private void ProcessButtonClickAction(object param)
{
BackgroundWorker BGWUpdateUi = new BackgroundWorker();
BGWUpdateUi.ProgressChanged += (sender, args) =>
{
ProgressBarValue += args.ProgressPercentage;
((SelectedDwgFile)args.UserState).Status = "Completed";
};
BGWUpdateUi.WorkerReportsProgress = true;
foreach(var obj in FileList)
{
Thread.Sleep(250);
BGWUpdateUi.ReportProgress(pbvalueIncrement, obj);
}
}
该集合是一个可观察集合
,进度条值
绑定到进度条的值
我已经看过几个例子,无论我尝试哪一个-
BackgroundWorker
,Dispatcher
,它们都会在循环后更新。将要在后台运行的部分放入DoWork
方法,然后调用RunWorkerAsync
:
private void ProcessButtonClickAction(object param)
{
BackgroundWorker BGWUpdateUi = new BackgroundWorker()
BGWUpdateUi.DoWork += (sender, args) =>
{
foreach (var obj in FileList)
{
Thread.Sleep(250);
obj.Status = "Completed";
ProgressBarValue += pbvalueIncrement;
}
};
BGWUpdateUi.RunWorkerAsync();
}
另外,请确保将与UI相关的更新发送回UI线程(否则会出现跨线程访问异常)。我想,我不明白。我想进入一个循环,在我执行一些逻辑之后,我想更新UI。我必须在DoWork事件中执行逻辑吗?@traemore是的,你必须将其放入
DoWork
,否则它将同步执行,并且UI在方法结束之前不会得到更新。对不起,我一定让你发疯了。:)我正在从ICommand执行此操作,所以我没有访问应用程序的权限。我的视图模型与我的视图完全分离。而且文件列表绑定到了一个数据网格
,所以我不能把它推到数组()。。。我几乎没醒,这有助于我清醒:P.应用程序
应该是一个静态类,所以您必须访问它?实际上,尽管没有调度程序,但还是可以尝试一下——它似乎可以工作,尽管我不明白为什么。@traemore就文件列表而言。。。我不知道,也许不用它试试。我以为你不能从后台线程访问UI内容,但也许我弄错了。。。