WPF MVVM更新后台工作者的视图模型

Tim*_*im 7 wpf mvvm backgroundworker

这个senerio有效吗?

我有一个View来维护一个Item.

我有View Model,它将Item对象(实现INotifyPropertyChanged)公开为View绑定的Property.

将Item对象传递给修改它的Backgroundworker是否有效,然后在BackgroundWorking完成时引发PropertyChanged事件?

或者BackgroundWorker不应该修改Item对象.我将使用BackgroundWorker传回的结果更新现有的Item对象.这将在RunWorkerCompleted事件中完成.但这会锁定UI线程并击败拥有背景工作者的对象吗?

困惑?

我会试着解释一下.

用户可以选择创建项目.我创建了视图和视图模型.在View模型中,创建一个空Item对象.他被提供了一个视图来维护项目.在选择"项类型"属性时,这会启动一个复杂的过程来创建用户输入的权限列表.我可以在创建列表时阻止UI线程,但这会给用户带来糟糕的体验.我想将处理传递给后台线程,同时保持UI活着.目前,我设置了一个标志来指示View正在加载的部分,将Item对象传递给BackgroundWorker,后者更新了可观察的Properties集合.当BackgroundWorking完成后,我调用PropertyChanged事件,该事件更新绑定到列表的View部分,并关闭该标志以指示该部分正在加载.这似乎没有任何问题.但我有一种直觉,我不应该在后台线程中更新视图模型中的绑定项.

谢谢蒂姆

HCL*_*HCL 8

听起来不错.只要您的item-object为no DependencyObject,就可以在后台worker中更改它们的属性.
DataBinding对象的属性将起作用,绑定引擎将自动为您执行线程切换.
但是,在不调度操作的情况下,不要在后台工作程序中填充数据绑定集合或操作DependencyObjects(例如UI控件)的属性.这会导致例外.

编辑:
仅用于澄清:真正的问题不是,如果item-object是a DependencyObject但是属性是a CLR-property还是a DependencyProperty.因为DependencyProperties绑定到DependencyObjects,我经常使用上面的简化,但它不是完整的事实.
这意味着如果你有一个CLR属性,你可以从外部线程设置它的值,无论你的类是否是DepenendencyObject.这与我的第一个陈述略有不同.