44 votes

Passer des données de page en page

Je suis à la recherche pour les meilleures pratiques sur la façon de transmettre des données de page en page.

Dans Une Page j'ai un bouton qui déclenche la Page B.
Sur la Page B, j'ai 6 zones de texte qui permettent à l'utilisateur de saisir des informations. Lorsque l'utilisateur est fait, le clic sur un bouton qui les ramène à la Page A.

Je veux passer que les données de retour à la Page A.

J'ai vu des suggestions à:

  • construire des documents XML et de les enregistrer pour le Stockage Isolé
  • l'utilisation de l'Application de la classe de stocker les informations dans les propriétés
  • passer comme une chaîne de requête

Je suis à la recherche de la Meilleure pratique. Est-il celui que les recommandations de Microsoft ou celui qui est généralement admis que la meilleure façon de faire?

Merci

63voto

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

puis dans une autre page simplement

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

23voto

Matt Lacey Points 50756

Personnellement, je préfère stocker les valeurs saisies dans la Page B dans un modèle(objet) qui est également accessible à la Page A.

Selon la façon dont vous vous dirigez vers la Page Un deuxième temps, un ou plusieurs des éléments suivants peuvent être usful à aider à comprendre la transmission de valeurs entre les pages:

Comment passer de la valeur d'image dans une page xaml à une autre page xaml dans windows phone 7?

Le passage d'un objet complexe à une page lors de la navigation dans un WP7 application Silverlight

Comment passer d'un objet à partir d'une page xaml à l'autre?

Comment passer d'une valeur comprise entre Silverlight pages pour WP7?

Comment puis-je naviguer d'une page xaml à l'autre, et de transmettre des valeurs?

4voto

Peon the Great Points 1069

Une chose que vous pouvez envisager est d'utiliser MVC: laissez votre application en tant que contrôleur, stockez toutes les données du modèle et les pages ne sont que des vues contenant de la logique d'interface utilisateur pure. Dans ce cas, vos pages sont des peintres et vous transmettez votre objet de modèle. Cela donne une bonne isolation de la logique métier et de l'interface utilisateur, de sorte que vous pouvez les réviser facilement.

BTW, Silverlight et XAML sont d'excellents outils pour MVC, c'est donc un match naturel.

3voto

avidgator Points 1111

Il ya un couple de choses en jeu ici. Tout d'abord, si/lorsque l'utilisateur utilise le bouton Retour pour revenir à la page A à la place de votre bouton, c'est l'information dans les zones de texte échangés ou pas (est de Retour = Annuler, ou est-Rappel = OK?)

Cela dit, si vous utilisez NavigationService.GoBack (ce qui devrait être à la place de NavigationService.Naviguer, parce que si vous utilisez l'appel de Naviguer, les coups répétés de l'arrière de la clé sera la cause de toutes sortes de mauvais UX pour vos utilisateurs), puis QueryStrings ne sont pas une option. Parce que les pages n'ont vraiment aucun moyen de faire référence à tous les autres dans le WP7 Silverlight système de navigation, vous devez utiliser une 3ème partie pour organiser vos données. Pour cela, vous pouvez vous tourner (a) le Stockage Isolé (lent et lourd, mais fail-safe), (b) Utiliser le PhoneApplicationService.Dictionnaire d'état, ou (c) utiliser les propriétés Globales d'une certaine sorte, que ce soit suspendue de l'objet application, ou à l'aide de la Statique/Singletons...

N'oubliez pas de regarder pour la Désactivation de comportement lorsque vous le faites, votre page sera procédé à la méthode OnNavigatedTo lorsque (un), vous accédez à votre application (b) vous revenez lorsque vous effectuez votre travail, à la Page B, ou (c) vous désactivation de votre application à partir de la page et revenir à votre application à l'aide de la touche Retour.

Désolé de ne pas donner une réponse directe, il y - a beaucoup dépend de votre situation spécifique. Dans le cas le plus général, je serais fortement penser à l'aide de l'Application Dictionnaire d'État sur la PhoneApplicationService...il est léger, facile à utiliser, et survit à la désactivation. Juste être sûr que vos clés sont uniques comme ils doivent l'être.

2voto

Omar Shahine Points 886

Si vous créez un nouveau projet Windows Phone et utiliser le Windows Phone lié aux données de Modèle , vous aurez la plupart du travail pour vous.

Ce que vous voulez faire est d'installer le ViewModel pour contenir toutes les données pour votre application. Vous pouvez sérialiser et désérialiser les données à l'aide de IsolatedStorage de sorte qu'il est enregistré à travers les sessions de l'application et lors de la Désactivation.

Dans le modèle, vous remarquerez MailViewModel et ItemViewModel. MainViewModel stocke toutes les données que votre application a besoin, y compris une ObservableCollection de ItemViewModel, et ItemViewModel représente chaque type de données pour votre application.

Sur le DetailsPage.xaml page, vous aurez envie de DataBind chaque zone de texte de l'Application.MainViewModel Éléments. La valeur la liaison Bidirectionnelle si vous voulez que le ViewModel mis à jour dès que l'utilisateur manipule les données sur DetailsPage.xaml. Vous pouvez également définir la Liaison Unidirectionnelle et un bouton OK qui écrit les modifications dans le ViewModel et les enregistre à l'IsolatedStorage.

Voici un exemple de ce qu'est une Liaison ressemble:

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

Dans ce cas LineOne est une propriété de ItemViewModel et la page est-ce des données à partir de la chaîne de requête lorsque l'utilisateur sélectionne un élément de la page d'accueil.xaml. Le DataContext de la page determs où les informations liées aux données.

Voici l'extrait où la page d'accueil passe à l'élément sélectionné dans le ViewModel de la 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;
}

Voici comment le DetailsPage obtient l'élément sélectionné.

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

Jouer avec le modèle par défaut ci-dessus et poser des questions supplémentaires.

La beauté de la liaison de données et l'ObservableCollection est que vous pouvez simplement mettre à jour les données et les UX vont refléter ces changements immédiatement. C'est parce que tout changement de données déclenche un événement:

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

NotifyPropertyChanged() qui diffuse cette information à la Vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X