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

时间:2016-10-05 15:49:08

标签: c# wpf multithreading mvvm

我有一个MVVM(C#/ WPF)应用程序,想要在后台线程中创建和填充我的ViewModel(带有INotifyPropertyChange)和ObservableCollections。

如果我这样做,我会得到一个例外:"必须在与DependencyObject相同的线程上创建DependencySource。"

我知道如何使用Dispatcher在UI-Thread中移动Actions。但是我不清楚必须转向UI-Thread。我有以下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

1 个答案:

答案 0 :(得分:1)

您无法在非ObservableCollection<T>.Add()主题上致电Dispatcher

您可以在非ObservableCollection<T>主题上创建Dispatcher

只要您没有在构造函数中进行任何ViewModel调用,那么创建Dispatcher对象的线程无关紧要。

更新有关PropertyChanged事件的评论:

您需要在PropertyChanged主题上引发Dispatcher个事件才能对其进行处理。我发现在Dispatcher.Invoke()电话中将事件的提升包装起来对这些情况很有用。

针对具体案例的答案进行更新

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