2010-09-02 7 views
6

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[].

+0

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

+0

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

risposta

1

L'eccezione che stai ricevendo ("Deve creare DependencySource sullo stesso thread come il DependencyObject") indica che qualcosa è stato creato su un thread in background e utilizzato sul thread dell'interfaccia utente. Ci sono controlli dell'interfaccia utente creati e memorizzati nella raccolta per l'utilizzo da parte dell'interfaccia utente?

Vedo che la stessa ObservableCollection viene creata su un thread in background, ma non penso che questo sia il problema - purtroppo non sono in ufficio per codificarlo e confermarlo.

+0

corretto. Nella mia classe MyItem avevo una proprietà BitmapImage, che alla fine eredita dalla classe DependencyObject. La modifica di quel tipo di dati in un byte [] ha invece risolto il problema. –

4

Puoi provare a sostituire il Dispatcher.CurrentDispatcher in Application.Current.Dispatcher non sono sicuro di questo, però

+0

Beh, sarò dannato. Non ho capito la differenza. Grazie. –

+0

Felice di essere di aiuto –

+0

Dopo aver cambiato il codice in un modello di Invoke molto migliore (vedi l'aggiornamento), il tuo suggerimento non funzionava più. –

Problemi correlati