从另一个类更新ObservableCollection

时间:2016-07-31 21:09:27

标签: wpf .net-4.5

我有一个绑定到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);
 }
}

1 个答案:

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