我在我的第一个 WPF 应用程序中使用 MVVM 模式,并且我认为有一些非常基本的问题。
当用户点击我的视图上的“保存”按钮时,将执行一个命令,该命令调用我的 ViewModel 中的 private void Save() 。
问题是“Save()”中的代码需要一些时间来执行,所以我想在执行大块代码之前隐藏 UI 视图中的“Save”按钮。
问题是,直到视图模型中的所有代码都执行完毕后,视图才会更新。
在执行 Save() 代码之前,如何强制视图重绘并处理 PropertyChanged 事件?
此外,我想要一种可重用的方式,这样我也可以轻松地在其他页面中执行相同的操作。其他人已经做了类似的事情吗? “正在加载...”消息?
如果需要很长时间,请考虑使用单独的线程,例如使用BackgroundWorker
,以便 UI 线程在执行操作时可以保持响应(即更新 UI)。
In your Save
方法,你会
- 更改 UI(即修改一些 INotifyPropertyChanged 或 DependencyProperty
IsBusySaving
绑定到您的 UI 的布尔值,隐藏“保存”按钮,并且可能显示一些进度条IsIndeterminate = True
) and
- start a
BackgroundWorker
.
In the DoWork
您的BackgroundWorker 的事件处理程序,您执行冗长的保存操作。
In the RunWorkerCompleted
事件处理程序,在 UI 线程中执行,您设置IsBusySaving
为 false 并可能更改 UI 中的其他内容以表明您已完成。
代码示例(未经测试):
BackgroundWorker bwSave;
DependencyProperty IsBusySavingProperty = ...;
private MyViewModel() {
bwSave = new BackgroundWorker();
bwSave.DoWork += (sender, args) => {
// do your lengthy save stuff here -- this happens in a separate thread
}
bwSave.RunWorkerCompleted += (sender, args) => {
IsBusySaving = false;
if (args.Error != null) // if an exception occurred during DoWork,
MessageBox.Show(args.Error.ToString()); // do your error handling here
}
}
private void Save() {
if (IsBusySaving) {
throw new Exception("Save in progress -- this should be prevented by the UI");
}
IsBusySaving = true;
bwSave.RunWorkerAsync();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)