2016-07-31 57 views
0

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

至于代码,主要类:

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

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

DataRetriver drt = new DataRetriver(dataStore); 
} 

这retrives数据的类:

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

@HamletHakobyan我加了一些代码,希望它的相关性够了。 – Hauba

+0

Dispatcher.Invoke –

回答

0

您可以使用调度程序来做到这一点。而要使用调度程序,你必须保留一个Dispatcher实例。例如,您可以在“调度员”通过你们类的构造函数发送UI调度员这样并将其存储:

DataRetriver drt = new DataRetriver(dataStore, requestView.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); 
     }); 
    } 
}