我有一个MVVM(C#/ WPF)应用程序,想要在后台线程中创建和填充我的ViewModel(带有INotifyPropertyChange)和ObservableCollections。
如果我这样做,我会得到一个例外:"必须在与DependencyObject相同的线程上创建DependencySource。"
我知道如何使用Dispatcher在UI-Thread中移动Actions。但是我不清楚必须转向UI-Thread。我有以下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
答案 0 :(得分:1)
您无法在非ObservableCollection<T>.Add()
主题上致电Dispatcher
。
您可以在非ObservableCollection<T>
主题上创建Dispatcher
。
只要您没有在构造函数中进行任何ViewModel
调用,那么创建Dispatcher
对象的线程无关紧要。
更新有关PropertyChanged事件的评论:
您需要在PropertyChanged
主题上引发Dispatcher
个事件才能对其进行处理。我发现在Dispatcher.Invoke()
电话中将事件的提升包装起来对这些情况很有用。
针对具体案例的答案进行更新
Dispatcher
- 构造函数中的特定调用,就可以在任何线程上。 Dispatcher
上引发。 Dispatcher
。