2011-02-10 15 views
44

Estoy buscando la mejor práctica sobre cómo pasar datos de una página a otra.Pasar datos de la página a la página

En la página A Tengo un botón que dispara la página B.
En la página B, tengo 6 cuadros de texto que permiten al usuario ingresar información. Cuando se realiza el usuario, el clic en un botón que los trae de vuelta a la página A.

quiero transmitir esos datos a la página A.

que he visto sugerencias a:

  • documentos XML acumulación y guardar en el almacenamiento aislado
  • utilizan la clase de aplicaciones para almacenar información en propiedades
  • pase como una cadena de consulta

Estoy buscando la mejor práctica. ¿Hay uno que Microsoft recomienda o uno que generalmente se acepta como la mejor manera?

Gracias

Respuesta

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

después en otra página, simplemente

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

Una cosa que se puede considerar es el uso de MVC: deje que su aplicación sea el controlador, almacenar todos los datos en el modelo, y las páginas son sólo puntos de vista que contiene la lógica de interfaz de usuario puro. En este caso, sus páginas son pintores y pasa su objeto modelo. Esto proporciona un buen aislamiento de la lógica de negocios y la interfaz de usuario para que pueda agilizarlos fácilmente.

BTW, Silverlight y XAML son excelentes herramientas para MVC, por lo que es una combinación natural.

+0

¿Hay algún ejemplo REALMENTE SIMPLE de cómo puedo hacer algo como esto usando MVC y WP7? – webdad3

+0

No tengo un ejemplo realmente simple, pero acabo de iniciar la plantilla "datos enlazados" y la miré hasta que pude ver cómo funcionaba. –

+1

Esto podría ayudarlo (aunque está en ASP, en realidad es una demostración bastante buena de MVC) http://agilewarrior.wordpress.com/2010/09/18/silverlight-model-view-controller-mvc-example/ –

3

Hay un par de cosas en juego aquí. En primer lugar, si/cuando el usuario usa el botón Atrás para regresar a la página A en lugar de a su botón, ¿la información en los cuadros de texto se intercambia o no (está Atrás = Cancelar, o está Atrás = OK?)

Dicho esto, si está utilizando NavigationService.GoBack (que debería ser en lugar de NavigationService.Navigate, porque si usa la llamada Navigate, los hits repetidos de la clave back causará todo tipo de UX incorrecto para sus usuarios), entonces QueryStrings no son una opción. Debido a que las páginas realmente no tienen forma de referencia en el sistema de navegación WP7 Silverlight, debe utilizar un tercero para almacenar sus datos. Para eso, puede activar (a) Almacenamiento aislado (lento & pesado, pero a prueba de fallas), (b) Usar el diccionario PhoneApplicationService.State, o (c) usar propiedades globales de algún tipo, colgadas de la aplicación objeto, o usando Estática/Singletons ...

Recuerde observar el comportamiento de Tombstoning cuando hace esto - su página procesará el método OnNavigatedTo cuando (a) navegue en su aplicación (b) navegue de nuevo a cuando completa su trabajo en la página B, o (c) destruye su aplicación desde esa página y regresa a su aplicación usando la tecla Atrás.

Lo siento, no he dado una respuesta más directa allí - mucho depende de sus circunstancias específicas. En el caso más general, consideraría utilizar el Diccionario de estado de la aplicación en PhoneApplicationService ... es liviano, fácil de usar y sobrevive. Solo asegúrese de que sus llaves sean tan únicas como deben ser.

+0

¿Hay alguna manera de borrar el estado? Digamos que quiero comenzar de nuevo sin tener que reiniciar la aplicación. – webdad3

23

Personalmente, almacena los valores ingresados ​​en la página B en un modelo (objeto) que también es accesible para Page A.

Dependiendo de cómo se está navegando a Página A la segunda vez, uno o más de los siguientes puede ser utiles para ayudar a comprender los valores que pasa entre las páginas:

How to pass the image value in one xaml page to another xaml page in windows phone 7?

Passing a complex object to a page while navigating in a WP7 Silverlight application

How to pass an object from a xaml page to another?

How to pass a value between Silverlight pages for WP7?

How do I navigate from one xaml page to another, and pass values?

2

Si crea un nuevo proyecto de Windows Phone y usa Windows Phone Databound Template, tendrá la mayor parte del trabajo hecho para usted.

Lo que debe hacer es configurar ViewModel para que contenga todos los datos de su aplicación. Puede serializar y deserializar estos datos utilizando IsolatedStorage para que se guarden en las sesiones de aplicaciones y en Tombstoning.

En la plantilla se dará cuenta de MailViewModel y ItemViewModel. MainViewModel almacena todos los datos que su aplicación necesita, incluida una ObservableCollection de ItemViewModel, y ItemViewModel representa el tipo de datos individual para su aplicación.

En la página DetailsPage.xaml, querrá vincular cada cuadro de texto a los elementos de App.MainViewModel. Establezca el enlace en TwoWay si desea que el ViewModel se actualice tan pronto como el usuario manipule los datos en DetailsPage.xaml. Opcionalmente, puede establecer la vinculación en OneWay y luego tener un botón Aceptar que vuelve a escribir los cambios en ViewModel y los guarda en IsolatedStorage.

Aquí es un ejemplo de lo que es un aspecto de encuadernación como:

<TextBlock x:Name="ListTitle" Text="{Binding LineOne}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 

En este caso LineOne es una propiedad en ItemViewModel y la página obtiene estos datos de la cadena de consulta cuando el usuario selecciona un elemento de la MainPage .xaml. El DataContext para la página determina de dónde proviene la información de datos.

Aquí está el fragmento donde la página principal pasa el elemento seleccionado del ViewModel a la página de detalles.

// 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; 
} 

Así es como la página de detalles obtiene el artículo seleccionado.

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]; 
    } 
} 

Juegue con la plantilla predeterminada de arriba y plantee preguntas adicionales.

La belleza de la vinculación de datos y ObservableCollection es que puede actualizar los datos y el UX reflejará esos cambios de forma inmediata. Esto se debe a que cualquier cambio en los fuegos de datos fuera de un evento:

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

NotifyPropertyChanged() que transmite esta información a la vista.

1

También puede hacerlo de forma simple y usar PhoneApplicationService.Current.State, que es básicamente una tabla hash.Deberá implementar su propia clasificación hacia y desde el almacenamiento aislado si desea que algo sobreviva a la aplicación.

La sugerencia de Omar de utilizar Windows Phone Databound Template es probablemente la mejor idea en esta página. Es lo mismo que mi sugerencia, pero obtendrá un mejor resultado (más código de mantenimiento) a costa de una curva de aprendizaje más empinada.

Le sugiero que lo haga a mi manera y luego hacerlo de nuevo Omar's way.

1

como he implementado como esto .. Ya sea correcta o no .. no sé

Cuando u haga clic en la página de noticias lista se debe abrir la página de detalles de noticias. Quiero pasar el contenido de las noticias seleccionadas de la página de lista de noticias a la página de detalles de noticias.

la página Lista de noticias contiene el siguiente método.

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); 
    } 

En las noticias detalles Página. U puede acceder a ese objeto (SelectedNewsItem).

Esto puede o no ser correcto.

1

Una opción es utilizar los datos Application.Resources:

tienda:

Application.Current.Resources.Add("NavigationParam", customers); 

NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative)); 

recuperar datos:

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

Aquí hay un post con describe esto con más detalle: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (autor: yo)

Cuestiones relacionadas