Il modo migliore per accedere ai dati su pagine diverse

3

Sto cercando un modo per caricare i dati in proprietà / variabili ecc. e avere queste informazioni accessibili a tutte le pagine della mia app. Voglio che le informazioni vengano caricate tramite un thread in background per mantenere libero il thread dell'interfaccia utente. Alcune pagine avranno varie proprietà dei loro controlli che si legano a queste proprietà globali.

Ecco cosa ho provato.

  • Creata una classe statica. Tutte le pagine possono accedere ai dati ma non possono vincolare.
  • Modificata la classe statica in Singleton e utilizzata DependencyProperty's. Tutte le pagine possono accedere ai dati e l'associazione ha funzionato correttamente, ma ha riscontrato problemi di cross-threading durante l'accesso tramite thread in background.

Ho letto in vari punti su questo argomento ma non ho ancora trovato il metodo migliore per la mia situazione.

    
posta Gaz83 16.05.2012 - 00:18
fonte

2 risposte

4

Probabilmente avrei associato ogni pagina a diversi ViewModel oggetti, e il tuo ViewModel si preoccuperà sull'accesso / aggiornamento dei dati nella tua classe "statica".

Se non è un'opzione, ricorda che DependencyObject non è l'unico modo per andare se vuoi associare una pagina a un oggetto. Personalmente preferisco usare INotifyPropertyChanged . In questo modo è possibile avere i dati di aggiornamento dell'interfaccia utente sul thread dell'interfaccia utente e continuare a leggere i dati su un thread diverso. Ovviamente avrai bisogno di scrivere il tuo codice in modo tale che sia sicuro per thread , ma almeno tu non otterrà un'eccezione durante l'accesso alle proprietà a cui è vincolata l'interfaccia utente.

Nota inoltre che i singleton hanno i loro lati negativi . Se fossi in te, probabilmente userei iniezione di dipendenza come alternativa, se possibile.

    
risposta data 25.09.2012 - 15:35
fonte
3

Non è possibile aggiornare l'interfaccia utente direttamente con un thread in background nelle applicazioni basate su Xaml. Tutti gli aggiornamenti dell'interfaccia utente devono essere eseguiti tramite Dispatcher sul thread dell'interfaccia utente.

Per assicurarti di utilizzare il thread di Dispatcher in un'applicazione WP7 (che è in realtà solo Silverlight) dovresti fare qualcosa del tipo:

Deployment.Current.Dispatcher.BeginInvoke( () => this.Detail = _staticObject.Detail);
    
risposta data 28.08.2012 - 20:38
fonte

Leggi altre domande sui tag