Passando dados de uma página para outra

Estou procurando a melhor prática sobre como passar dados de uma página para outra.

Na página AI, você tem um botão que triggers a página B.
Na página BI, existem 6 checkboxs de texto que permitem ao usuário inserir informações. Quando o usuário terminar, clique em um botão que o traga de volta à Página A.

Eu quero passar esses dados de volta para a página A.

Eu vi sugestões para:

  • criar documentos XML e salvar em armazenamento isolado
  • use a class App para armazenar informações em propriedades
  • passá-lo como uma string de consulta

Estou procurando a melhor prática. Existe um que a Microsoft recomenda ou um que é geralmente aceito como o melhor caminho?

obrigado

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

então em outra página simplesmente

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

Pessoalmente, eu armazenaria os valores inseridos na Página B em um modelo (object) que também é acessível à Página A.

Dependendo de como você está navegando na Página A pela segunda vez, um ou mais dos seguintes itens podem ser úteis para ajudar a entender os valores de passagem entre as páginas:

Como passar o valor da imagem em uma página xaml para outra página xaml no windows phone 7?

Passando um object complexo para uma página enquanto navega em um aplicativo WP7 Silverlight

Como passar um object de uma página xaml para outro?

Como passar um valor entre as páginas do Silverlight para o WP7?

Como eu navego de uma página xaml para outra e passo valores?

Uma coisa que você pode considerar é usar o MVC: deixe seu aplicativo ser o controlador, armazene todos os dados no modelo e as páginas são apenas exibições que contêm lógica da IU pura. Nesse caso, suas páginas são pintoras e você passa o object do modelo. Isso proporciona um bom isolamento da lógica de negócios e da interface do usuário, para que você possa alterá-las facilmente.

BTW, Silverlight e XAML são ótimas ferramentas para MVC, então é uma combinação natural.

Há algumas coisas em jogo aqui. Primeiro de tudo, se / quando o usuário usa o botão Voltar para retornar à página A ao invés do seu botão, é a informação nas checkboxs de texto trocadas ou não (é Back = Cancel, ou está Back = OK?)

Dito isto, se você estiver usando NavigationService.GoBack (que você deve estar em vez de NavigationService.Navigate, porque se você usar a chamada Navigate, sucessos repetidos da chave de retorno causará todos os tipos de UX ruim para seus usuários), então QueryStrings não são uma opção. Como as páginas realmente não têm como fazer referência umas às outras no sistema de navegação WP7 Silverlight, você precisa usar um terceiro para armazenar seus dados. Para isso, você pode recorrer a (a) Armazenamento isolado (lento e pesado, mas à prova de falhas), (b) Usar o dictionary PhoneApplicationService.State ou (c) usar propriedades globais de algum tipo, seja pendurado no aplicativo object, ou usando Statics / Singletons …

Lembre-se de observar o comportamento de tombamento ao fazer isso – sua página processará o método OnNavigatedTo quando (a) você navegar nele em seu aplicativo (b) navegar de volta para ele quando concluir seu trabalho na Página B, ou (c) você separe seu aplicativo dessa página e retorne ao seu aplicativo usando a tecla Voltar.

Desculpe eu não dei uma resposta mais direta lá – muito depende de suas circunstâncias específicas. No caso mais geral, eu consideraria o uso do App State Dictionary no PhoneApplicationService … ele é leve, fácil de usar e sobrevive a tombstoning. Apenas certifique-se de que suas chaves são tão únicas quanto elas precisam ser.

Se você criar um novo projeto do Windows Phone e usar o modelo de vinculação de dados do Windows Phone , terá a maior parte do trabalho feito para você.

O que você vai querer fazer é configurar o ViewModel para conter todos os dados do seu aplicativo. Você pode serializar e desserializar esses dados usando o IsolatedStorage para que ele seja salvo nas sessões do aplicativo e no Tombstoning.

No modelo, você notará MailViewModel e ItemViewModel . MainViewModel armazena todos os dados que seu aplicativo precisa, incluindo um ObservableCollection de ItemViewModel, e ItemViewModel representa o tipo de dados individual para o seu aplicativo.

Na página DetailsPage.xaml, você desejará DataBind each textbox aos itens do App.MainViewModel. Configure a binding para TwoWay se desejar que o ViewModel seja atualizado assim que o usuário manipular os dados em DetailsPage.xaml. Opcionalmente, você pode definir a vinculação como OneWay e, em seguida, ter um botão OK que grava as alterações novamente no ViewModel e salva em IsolatedStorage.

Aqui está um exemplo de como uma binding se parece:

  

Neste caso, LineOne é uma propriedade em ItemViewModel e a página obtém esses dados da string de consulta quando o usuário seleciona um item da MainPage.xaml. O DataContext da página determina de onde as informações de dados são originadas.

Aqui está o trecho em que a MainPage passa o item selecionado do ViewModel para o 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; } 

Aqui está como o DetailsPage obtém o item selecionado.

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

Brinque com o modelo padrão acima e faça perguntas adicionais.

A beleza da binding de dados e do ObservableCollection é que você pode apenas atualizar os dados e o UX refletirá essas alterações imediatamente. Isso ocorre porque qualquer alteração nos dados triggers um evento:

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

NotifyPropertyChanged () que transmite essa informação para o View.

Você também pode mantê-lo simples e usar PhoneApplicationService.Current.State, que é basicamente um hashtable. Você precisará implementar o seu próprio empacotamento para armazenamento isolado, se quiser que alguma coisa sobreviva ao aplicativo.

A sugestão de Omar para usar o modelo de vinculação de dados do Windows Phone é provavelmente a melhor ideia nesta página. Isso equivale ao mesmo que a minha sugestão, mas você obterá um resultado melhor (código mais sustentável) ao custo de uma curva de aprendizado mais longa.

Eu sugiro que você faça do meu jeito e depois faça de novo o jeito do Omar.

como eu implementado assim .. Se é correto ou não eu não sei ..

Quando você clicar na página da lista de notícias, deverá abrir a página de detalhes da notícia. Quero passar o conteúdo do item de notícias selecionado da página de listview de notícias para a página de detalhes de notícias.

a página da lista de notícias contém o seguinte 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); } 

Na página de detalhes da notícia. U pode acessar esse object (SelectedNewsItem).

Isso pode ou não estar correto.

Uma opção é usar Application.Resources:

Armazenamento de dados:

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

Recuperar dados:

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

Aqui está uma postagem no blog que descreve isso com mais detalhes: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (autor: me)