2016-07-31 37 views
0

Ich habe eine ObservableCollection an ein DataGrid gebunden. Ich möchte die Sammlung in einer anderen Klasse aktualisieren, die eine asynchrone Funktion ausführt. Derzeit, wenn ich versuche, es normal hinzuzufügen, erhalte ich den Fehler: This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread. Lesen andere Fragen viele vorschlagen BindingOperations.EnableCollectionSynchronization, aber ich habe keine Ahnung, wie Sie es implementieren, und ich kann keine Beispiele finden, die es aus einer anderen Klasse ausführen. Ist dies der richtige Weg, die Sammlung zu aktualisieren, da sie sehr häufig aktualisiert werden würden, oder gibt es einen besseren Weg?ObservableCollection von einer anderen Klasse aktualisieren

Wie für den Code, Hauptklasse:

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

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

DataRetriver drt = new DataRetriver(dataStore); 
} 

und die Klasse, die retrives Daten:

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

Zeigen Sie minimalen relevanten Code. –

+0

@HamletHakobyan Ich habe Code hinzugefügt, hoffe, es ist relevant genug. – Hauba

+0

Dispatcher.Invoke –

Antwort

0

Sie Dispatcher, dies zu tun verwenden können. Um Dispatcher zu verwenden, müssen Sie eine Dispatcher-Instanz behalten. Zum Beispiel können Sie UI Dispatcher über Sie Klassenkonstruktors wie diese und speichern Sie es in „Dispatcher“ senden:

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

Dann wird der folgende Code wird den Job erledigen, aber das wissen, laufen Dispatcher Aufgaben auf UI-Thread daher die mehr Operationen Sie senden an den Dispatcher, je weniger Hintergrundprozess Sie tun, die Dinge in verschiedenen Threads zu tun, ist weniger nützlich. Sie könnten also in Betracht ziehen, Ihre Liste in einem anderen Objekt im Hintergrund zu erstellen und sie in einem Schritt (nicht in einer Schleife) auf das ursprüngliche Objekt zu setzen.

parseData(dynamic data) 
{ 
    //parse data and make a list with items for collection 
    foreach(myClass item in items) 
    { 
     dispatcher.Invoke(()=>{ 
     localStore.requestData.Add(item); 
     }); 
    } 
}