Ладно, производные классы CollectionViewSource, BindableList, ObservableCollection и т. Д. Эти классы могут быть созданы только в основном потоке диспетчера.
Однако вы должны попробовать что-то вроде следующего,
Создайте свой collectionviewsource только в своих производных классах WPF, используйте классы List <> для загрузки ваших объектов в другой поток, и после этого вы можете перенести из списка в collectionviewsource, как описано ниже, я бы порекомендовал BindingList, поскольку вы можете добавить несколько элементов, отключив обновление для убрать мерцание.
Создайте свой объект коллекции неявно в ваших классах WPF следующим образом
public class MyWindow : UserControl{
BindingList<MyObject> ObjectList = new BindingList<MyObject>;
public MyWindow(){
ObjectList.AllowAdd = true;
ObjectList.AllowDelete = true;
ObjectList.AllowEdit = true;
}
public void LoadObjects(){
ThreadPool.QueryUserItem( (s)=>{
// load your objects in list first in different thread
List<MyObject> list = MyLongMethodToLoadObjects();
Dispatcher.BeginInvoke( (Action)delegate(){
list.RaiseEvents = false;
foreach(MyObject obj in list){
ObjectList.Add(obj);
}
list.RaiseEvents = true;
list.ResetBindings();
});
});
}
}
Я не знаю, что этот код не форматируется правильно, но вы можете попробовать увидеть его в visual studio, чтобы получить правильное представление.