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.
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? –
@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. –