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