我可以在后台线程中创建或填充ViewModels和ObservableCollection吗?
本文关键字:ViewModels ObservableCollection 填充 后台 线程 创建 我可以 | 更新日期: 2023-09-27 18:11:55
我有一个MVVM (c#/WPF)应用程序,并希望在后台线程中创建和填充我的ViewModels(与INotifyPropertyChange)和ObservableCollections。
如果我这样做,我得到一个异常:"必须创建DependencySource在同一线程作为DependencyObject。"
我知道如何使用Dispatcher在ui线程中移动Actions。但我不清楚什么必须移动到ui线程。我有以下5种情况。
-
var vm = new ViewModel(); // implements INotifyPropertyChange
-
vm.Name = "name"; // Fires PropertyChange
-
var oc = new ObservableCollection<ViewModel>();
-
oc.Add(vm);
-
var oc2 = new ObservableCollection<ViewModel>(list); // while list is List of ViewModel
不能在非Dispatcher
线程上调用ObservableCollection<T>.Add()
。
可以在非Dispatcher
线程上创建ObservableCollection<T>
。
只要在构造函数中没有任何Dispatcher
-only调用,在哪个线程上创建ViewModel
对象都不重要。
更新PropertyChanged事件的注释:
您需要在Dispatcher
线程上引发PropertyChanged
事件,以便处理它们。我发现在这些情况下,将事件的引发包装在Dispatcher.Invoke()
调用中是有用的。
针对具体案例的答案更新
- 情况1:可以在任何线程上,只要在构造函数中没有特定于
Dispatcher
的调用。 - 案例2:如果您希望事件由任何绑定控件处理,则应该在
Dispatcher
上引发。 - 情况3:可以在任何线程上。
- 案例4:必须在
Dispatcher
上。 - 案例5:可以在任何线程上。