我有一个绑定到DataGrid的ObservableCollection。我想在另一个运行异步函数的类中更新集合。目前,当我尝试正常添加时,我收到错误:This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread
。阅读其他许多问题建议使用BindingOperations.EnableCollectionSynchronization
,但我不知道如何实现它,我找不到任何从另一个类运行它的例子。这是更新集合的正确方法,因为它们会经常更新,还是有更好的方法?
关于代码,Main class:
public DataStore dataStore = new DataStore();
public MainWindow() {
InitializeComponent();
requestView.ItemsSource = dataStore.requestData;
responseView.ItemsSource = dataStore.responseData;
DataRetriver drt = new DataRetriver(dataStore);
}
以及回收数据的类:
public class DataRetriver
{
DataStore localStore;
public BidAskDataRetriver(DataStore ds)
{
this.localStore = ds;
runA();
}
public void runA()
{
//Build listener
listener.Bind("data", (dynamic data) => {
//data = json
parseData(data);
});
}
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
localStore.requestData.Add(item);
}
}
答案 0 :(得分:0)
您可以使用Dispatcher执行此操作。要使用调度程序,您必须保留Dispatcher实例。例如,您可以通过类构造函数发送UI调度程序,并将其存储在"调度程序":
DataRetriver drt = new DataRetriver(dataStore, requestView.Dispatcher);
然后,下面的代码将完成这项工作但是知道这一点,Dispatcher任务在UI线程上运行,因此您发送给Dispatcher的操作越多,在不同线程中执行操作的后台进程就越少。因此,您可以考虑在后台的另一个对象中创建列表,并在一个步骤(而不是循环)中将其设置为原始对象。
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
{
dispatcher.Invoke(()=>{
localStore.requestData.Add(item);
});
}
}