从另一个 class 更新 ObservableCollection

Updating ObservableCollection from another class

我有一个绑定到 DataGrid 的 ObservableCollection。我想更新另一个 class 中的集合,运行 是一个异步函数。目前,当我尝试正常添加它时,出现错误:This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread。阅读许多建议使用 BindingOperations.EnableCollectionSynchronization 的其他问题,但我不知道如何实现它,而且我无法从另一个 class 中找到 运行 的任何示例。这是更新集合的正确方法吗,因为它们会非常频繁地更新,或者有更好的方法吗?

至于代码,Main class:

public DataStore dataStore = new DataStore();
public MainWindow() {

 InitializeComponent();
 requestView.ItemsSource = dataStore.requestData;
 responseView.ItemsSource = dataStore.responseData;

 DataRetriver drt = new DataRetriver(dataStore);
}

和检索数据的class:

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);
 }
}

您可以使用 Dispatcher 来执行此操作。要使用调度程序,您必须保留一个 Dispatcher 实例。例如,您可以像这样通过 class 构造函数发送 UI 调度程序并将其存储在 "dispatcher":

DataRetriver drt = new DataRetriver(dataStore, requestView.Dispatcher);

然后下面的代码将完成这项工作,但知道这一点,Dispatcher tasks 运行 on UI thread 因此,您发送给 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);
      });
   }
 }