Sto raccogliendo dati in un'attività separata e desidero associare i dati a un componente della GUI utilizzando uno ObservableCollection<>
. Quindi il mio codice va in questo modo:Come gestire ObservableCollection <> risultato da un'attività parallela 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;
});
});
}
I dati vengono recuperati da un componente che esegue alcune richieste HTTP. L'errore che sto ottenendo è:
Must create DependencySource on same Thread as the DependencyObject.
Sto utilizzando il framework MVVM Light. Ho anche provato a inviare il risultato come messaggio, ma è finito nello stesso messaggio di errore. Qualche idea o suggerimento?
EDIT: Ecco il problema:
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; }
}
ho cambiato il BitmapImage
ad un tipo di dati byte[]
.
Se si suppone che il compito si svolga in background in modo che non blocchi l'interfaccia utente, sembra strano che la prima cosa da fare sia Richiamare di nuovo nel thread dell'interfaccia utente - non bloccherà tutto l'input dell'interfaccia utente mentre il _htmlParser sta recuperando i dati? –
@ Martin, stai sollevando un ottimo punto. Quando ho messo la domanda insieme, ho rapidamente semplificato il codice. Ora ho aggiornato la domanda con un flusso di codice migliore. –