2010-09-02 7 views
6

Ich sammle Daten in einer separaten Aufgabe, und ich möchte das Ergebnis an eine GUI-Komponente mit einem ObservableCollection<> binden. Mein Code lautet also etwa:Wie behandelt man ObservableCollection <> Ergebnis einer parallelisierten Aufgabe in MVVM?

private ObservableCollection<MyItem> _items; 
public ObservableCollection<MyItem> Items 
{ 
    get { return _items; } 
    set 
    { 
    if (_items.Equals(value)) 
    { 
     return; 
    } 
    _items = value; 
    RaisePropertyChanged("Items"); 
    } 
} 

private void LoadData() 
{ 
    Task task = Task.Factory.StartNew(() => 
    { 
    ObservableCollection<MyItem> itms = _htmlParser.FetchData(...); 

    Dispatcher.CurrentDispatcher.Invoke((Action)delegate 
    { 
     Items = itms; 
    }); 
    }); 
} 

Die Daten werden von einer Komponente abgerufen, die einige HTTP-Anforderungen ausführt. Der Fehler, den ich erhalte, ist:
Must create DependencySource on same Thread as the DependencyObject.

Ich benutze das MVVM Light Toolkit-Framework. Ich habe auch versucht, das Ergebnis als eine Nachricht zu senden, aber das endete in der gleichen Fehlermeldung. Irgendwelche Ideen oder Hinweise?

EDIT: Hier ist die Frage:

public class MyItem 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject 
    public Uri Uri { get; set; } 
} 

ich die BitmapImage auf einen Typ byte[] Daten geändert.

+0

Wenn Ihre Aufgabe im Hintergrund ausgeführt werden soll, damit die Benutzeroberfläche nicht gesperrt wird, erscheint es seltsam, dass Sie zuerst in den UI-Thread zurückrufen - blockiert dies nicht alle Benutzereingaben währenddessen Der _htmlParser holt die Daten? –

+0

@Martin, Sie heben einen sehr guten Punkt. Als ich die Frage zusammenstellte, habe ich den Code schnell vereinfacht. Ich habe die Frage jetzt mit einem besseren Code-Flow aktualisiert. –

Antwort

1

Die Ausnahme Sie bekommen („Must DependencySource auf gleiche Thema wie die DependencyObject erstellen“) gibt an, dass ist etwas, auf einem Hintergrund-Thread erstellt werden und im UI-Thread verwendet. Gibt es UI-Steuerelemente, die in der Sammlung zur Verwendung durch die Benutzeroberfläche erstellt und gespeichert werden?

Ich sehe, dass die ObservableCollection selbst auf einem Hintergrund-Thread erstellt wird, aber ich glaube nicht, dass das das Problem ist - leider bin ich nicht im Büro, um das zu kodieren und zu bestätigen.

+0

Korrigieren. In meiner MyItem-Klasse hatte ich eine BitmapImage-Eigenschaft, die letztendlich von der DependencyObject-Klasse erbt. Wenn Sie dies stattdessen in einen byte [] - Datentyp ändern, wird das Problem behoben. –

4

Können Sie versuchen, die Dispatcher.CurrentDispatcher in Application.Current.Dispatcher nicht sicher über dieses allerdings zu ersetzen

+0

Nun, ich werde verdammt sein. Habe den Unterschied nicht bemerkt. Vielen Dank. –

+0

Froh, Hilfe zu sein –

+0

Nach dem Ändern des Codes zu einem viel besseren Invoke-Muster (siehe das Update), konnte Ihr Vorschlag nicht mehr funktionieren. –

Verwandte Themen