Trasmissione dei dati da una pagina all’altra

Sto cercando le migliori pratiche su come passare i dati da una pagina all’altra.

Nella pagina AI è presente un pulsante che spegne la pagina B.
Nella pagina BI sono disponibili 6 caselle di testo che consentono all’utente di immettere informazioni. Quando l’utente ha terminato, fai clic su un pulsante che li riporta alla pagina A.

Voglio passare quei dati alla pagina A.

Ho visto suggerimenti per:

  • creare documenti XML e salvarli in una memoria isolata
  • utilizzare la class App per memorizzare le informazioni nelle proprietà
  • passarlo come una stringa di query

Sto cercando le migliori pratiche. C’è uno che Microsoft consiglia o uno che è generalmente accettato come il modo migliore?

Grazie

PhoneApplicationService.Current.State["yourparam"] = param NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative)); 

poi in un’altra pagina semplicemente

 var k = PhoneApplicationService.Current.State["yourparam"]; 

Personalmente memorizzerei i valori inseriti nella Pagina B in un modello (object) accessibile anche dalla pagina A.

A seconda di come stai navigando alla pagina A una seconda volta, uno o più dei seguenti potrebbero essere utili per aiutare a comprendere i valori di passaggio tra le pagine:

Come passare il valore dell’immagine in una pagina xaml in un’altra pagina xaml in Windows Phone 7?

Passaggio di un object complesso a una pagina durante la navigazione in un’applicazione Silverlight WP7

Come passare un object da una pagina xaml ad un altro?

Come passare un valore tra le pagine Silverlight per WP7?

Come posso navigare da una pagina xaml a un’altra e passare valori?

Una cosa che puoi considerare è usare MVC: lascia che la tua App sia il controller, memorizzi tutti i dati nel modello e le pagine siano solo viste che contengono la pura logica dell’interfaccia utente. In questo caso le tue pagine sono pittori e tu passi il tuo object modello in giro. Ciò offre un buon isolamento della logica aziendale e dell’interfaccia utente, in modo tale da poterli modificare facilmente.

BTW, Silverlight e XAML sono ottimi strumenti per MVC quindi è una partita naturale.

Ci sono un paio di cose in gioco qui. Innanzitutto, se / quando l’utente utilizza il pulsante Indietro per tornare alla pagina A anziché il pulsante, le informazioni nelle caselle di testo vengono scambiate o meno (è Indietro = Annulla oppure è Indietro = OK?)

Detto questo, se stai utilizzando NavigationService.GoBack (che dovresti essere invece di NavigationService.Navigate, perché se usi la chiamata Navigate, i colpi ripetuti del tasto Indietro causeranno tutti i tipi di UX errato per i tuoi utenti), quindi QueryStrings non sono un’opzione. Poiché le pagine non hanno davvero alcun modo di fare riferimento l’un l’altro nel sistema di navigazione Silverlight WP7, è necessario utilizzare una terza parte per conservare i dati. A tale scopo, è ansible passare a (a) storage isolato (lento e pesante, ma sicuro), (b) utilizzare il dizionario PhoneApplicationService.State o (c) utilizzare le proprietà globali di qualche tipo, appese all’applicazione object, o usando Statics / Singletons …

Ricordarsi di osservare il comportamento di Tombstoning quando si esegue questa operazione: la pagina elabora il metodo OnNavigatedTo quando (a) si naviga nell’applicazione (b) si torna ad essa quando si completa il lavoro sulla Pagina B o (c) tu separi la tua app da quella pagina e ritorni alla tua applicazione usando il tasto Indietro.

Mi spiace di non aver dato una risposta più diretta lì – molto dipende dalle tue circostanze specifiche. Nel caso più generale, prenderei seriamente in considerazione l’utilizzo del dizionario di stato dell’applicazione su PhoneApplicationService … è leggero, facile da usare e sopravvive al distacco. Basta essere sicuri che le tue chiavi siano uniche come devono essere.

Se crei un nuovo progetto Windows Phone e utilizzi il modello di database di Windows Phone , avrai la maggior parte del lavoro svolto per te.

Quello che vorrai fare è configurare ViewModel per contenere tutti i dati della tua app. È ansible serializzare e deserializzare questi dati utilizzando IsolatedStorage in modo che venga salvato nelle sessioni dell’applicazione e durante il Tombstoning.

Nel modello noterai MailViewModel e ItemViewModel . MainViewModel memorizza tutti i dati necessari alle applicazioni, tra cui ObservableCollection di ItemViewModel e ItemViewModel rappresenta il singolo tipo di dati per la tua applicazione.

Nella pagina DetailsPage.xaml dovrai associare DataBind a ciascuna casella di testo agli elementi App.MainViewModel. Impostare il binding su TwoWay se si desidera che ViewModel venga aggiornato non appena l’utente manipola i dati su DetailsPage.xaml. È ansible impostare opzionalmente il binding su OneWay e quindi premere OK per scrivere nuovamente le modifiche su ViewModel e salvarle su IsolatedStorage.

Ecco un esempio di come si presenta un binding:

  

In questo caso LineOne è una proprietà in ItemViewModel e la pagina ottiene questi dati dalla stringa di query quando l’utente seleziona un elemento da MainPage.xaml. Il DataContext per la pagina determina da dove proviene l’informazione del database.

Ecco lo snippet in cui la pagina principale passa l’elemento selezionato da ViewModel a DetailsPage.

 // Handle selection changed on ListBox private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { // If selected index is -1 (no selection) do nothing if (MainListBox.SelectedIndex == -1) return; // Navigate to the new page NavigationService.Navigate(new Uri("/DetailsPage.xaml?selectedItem=" + MainListBox.SelectedIndex, UriKind.Relative)); // Reset selected index to -1 (no selection) MainListBox.SelectedIndex = -1; } 

Ecco come il DetailsPage ottiene l’elemento selezionato.

 protected override void OnNavigatedTo(NavigationEventArgs e) { string selectedIndex = ""; if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex)) { int index = int.Parse(selectedIndex); DataContext = App.ViewModel.Items[index]; } } 

Gioca con il modello predefinito sopra e fai altre domande.

La bellezza di database e ObservableCollection è che puoi semplicemente aggiornare i dati e la UX rifletterà immediatamente tali cambiamenti. Questo perché qualsiasi modifica ai dati triggers un evento:

 public string LineOne { get { return _lineOne; } set { if (value != _lineOne) { _lineOne = value; NotifyPropertyChanged("LineOne"); } } } 

NotifyPropertyChanged () che trasmette queste informazioni alla vista.

Puoi anche mantenerlo semplice e utilizzare PhoneApplicationService.Current.State che è fondamentalmente una tabella hash. Dovrai implementare il tuo marshalling da e verso un archivio isolato se vuoi che sopravviva l’app.

Il suggerimento di Omar di utilizzare il modello di database di Windows Phone è probabilmente l’idea migliore su questa pagina. Ammonta al mio suggerimento ma otterrai un risultato migliore (codice più gestibile) al costo di una curva di apprendimento più lunga.

Ti suggerisco di farlo a modo mio e poi farlo di nuovo modo di Omar.

come ho implementato in questo modo .. Se è corretto o meno non lo so ..

Quando fai clic sulla pagina dell’elenco delle notizie, dovrebbe aprire la pagina dei dettagli delle notizie. Voglio passare il contenuto della notizia selezionata dalla pagina della lista delle notizie alla pagina dei dettagli delle notizie.

la pagina dell’elenco delle notizie contiene il seguente metodo.

  protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { NewsDetailsPage newsDetailPage = (e.Content as NewsDetailsPage); if (newsDetailPage != null) newsDetailPage.SelectedNewsItem = SelectedNewsItem; //Contains the news details base.OnNavigatedFrom(e); } 

Nella pagina dei dettagli di notizie. U può accedere a quell’object (SelectedNewsItem).

Questo potrebbe o potrebbe non essere corretto.

Un’opzione è usare Application.Resources:

Immagazzina dati:

 Application.Current.Resources.Add("NavigationParam", customers); NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative)); 

Recupera dati:

 var customers = (List) Application.Current.Resources["NavigationParam"]; 

Ecco un post sul blog con la descrizione più dettagliata: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (autore: me)