我可以在后台线程中创建或填充ViewModels和ObservableCollection吗?

本文关键字:ViewModels ObservableCollection 填充 后台 线程 创建 我可以 | 更新日期: 2023-09-27 18:11:55

我有一个MVVM (c#/WPF)应用程序,并希望在后台线程中创建和填充我的ViewModels(与INotifyPropertyChange)和ObservableCollections。

如果我这样做,我得到一个异常:"必须创建DependencySource在同一线程作为DependencyObject。"

我知道如何使用Dispatcher在ui线程中移动Actions。但我不清楚什么必须移动到ui线程。我有以下5种情况。

  1. var vm = new ViewModel(); // implements INotifyPropertyChange
  2. vm.Name = "name"; // Fires PropertyChange
  3. var oc = new ObservableCollection<ViewModel>();
  4. oc.Add(vm);
  5. var oc2 = new ObservableCollection<ViewModel>(list); // while list is List of ViewModel

我可以在后台线程中创建或填充ViewModels和ObservableCollection吗?

不能在非Dispatcher线程上调用ObservableCollection<T>.Add()

可以在非Dispatcher线程上创建ObservableCollection<T>

只要在构造函数中没有任何Dispatcher -only调用,在哪个线程上创建ViewModel对象都不重要。

更新PropertyChanged事件的注释:

您需要在Dispatcher线程上引发PropertyChanged事件,以便处理它们。我发现在这些情况下,将事件的引发包装在Dispatcher.Invoke()调用中是有用的。

针对具体案例的答案更新

  • 情况1:可以在任何线程上,只要在构造函数中没有特定于Dispatcher的调用。
  • 案例2:如果您希望事件由任何绑定控件处理,则应该在Dispatcher上引发。
  • 情况3:可以在任何线程上。
  • 案例4:必须在Dispatcher上。
  • 案例5:可以在任何线程上。