web-dev-qa-db-fra.com

Passer des données d'une page à l'autre

Je recherche la meilleure pratique pour transmettre des données d'une page à l'autre.

Sur la page A, j'ai un bouton qui déclenche la page B.
Sur la page B, j'ai 6 zones de texte qui permettent à l'utilisateur d'entrer des informations. Lorsque l'utilisateur a terminé, cliquez sur un bouton qui le ramène à la page A.

Je souhaite transmettre ces données à la page A.

J'ai vu des suggestions pour:

  • créer des documents XML et enregistrer sur un stockage isolé
  • utiliser la classe App pour stocker des informations dans les propriétés
  • passer comme une chaîne de requête

Je recherche la meilleure pratique. Y en a-t-il un que Microsoft recommande ou qui est généralement accepté comme le meilleur moyen?

Merci

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

puis sur une autre page simplement

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

Personnellement, je stocke les valeurs entrées sur la page B dans un modèle (objet) qui est également accessible à la page A.

Selon la façon dont vous accédez à la page A pour la deuxième fois, un ou plusieurs des éléments suivants peuvent être utiles pour vous aider à comprendre le passage des valeurs entre les pages:

Comment passer la valeur de l'image dans une page xaml à une autre page xaml dans Windows Phone 7?

Passer un objet complexe à une page lors de la navigation dans une application WP7 Silverlight

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

Comment passer une valeur entre les pages Silverlight pour WP7?

Comment naviguer d'une page xaml à une autre et transmettre des valeurs?

23
Matt Lacey

Vous pouvez envisager d'utiliser MVC: laissez votre application être le contrôleur, stockez toutes les données dans le modèle et les pages ne sont que des vues contenant une logique d'interface utilisateur pure. Dans ce cas, vos pages sont des peintres et vous passez votre objet modèle autour. Cela donne une belle isolation de la logique métier et de l'interface utilisateur afin que vous puissiez les réviser facilement.

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

4
Peon the Great

Il y a quelques choses en jeu ici. Tout d'abord, si/quand l'utilisateur utilise le bouton Retour pour revenir à la page A au lieu de votre bouton, les informations contenues dans les zones de texte sont-elles échangées ou non (est-ce que Back = Annuler, ou est-ce = Back = OK?)

Cela dit, si vous utilisez NavigationService.GoBack (ce que vous devriez être à la place de NavigationService.Navigate, car si vous utilisez l'appel Navigate, les appels répétés de la touche retour provoqueront toutes sortes de mauvaises UX pour vos utilisateurs), alors QueryStrings ne sont pas une option. Parce que les pages n'ont vraiment aucun moyen de se référencer dans le système de navigation WP7 Silverlight, vous devez utiliser un tiers pour conserver vos données. Pour cela, vous pouvez vous tourner vers (a) un stockage isolé (lent et lourd, mais à sécurité intégrée), (b) utiliser le dictionnaire PhoneApplicationService.State, ou (c) utiliser des propriétés globales d'une certaine sorte, soit suspendues à l'application. objet, ou en utilisant Statique/Singletons ...

N'oubliez pas de surveiller le comportement Tombstoning lorsque vous faites cela - votre page traitera la méthode OnNavigatedTo lorsque (a) vous y naviguerez dans votre application (b) vous y reviendrez lorsque vous terminerez votre travail sur la page B, ou (c) vous désactivez votre application à partir de cette page et revenez à votre application à l'aide de la touche Retour.

Désolé, je n'ai pas donné de réponse plus directe - cela dépend beaucoup de votre situation particulière. Dans le cas le plus général, j'envisagerais fortement d'utiliser le dictionnaire d'état de l'application sur le PhoneApplicationService ... il est léger, facile à utiliser et survit aux tergiversations. Assurez-vous simplement que vos clés sont aussi uniques qu'elles doivent l'être.

3
avidgator

Si vous créez un nouveau projet Windows Phone et utilisez le Windows Phone Databound Template vous aurez la plupart du travail effectué pour vous.

Ce que vous voudrez faire est de configurer le ViewModel pour contenir toutes les données de votre application. Vous pouvez sérialiser et désérialiser ces données en utilisant IsolatedStorage afin qu'elles soient enregistrées sur les sessions d'application et lors de la désactivation.

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

Sur la page DetailsPage.xaml, vous souhaiterez lier DataBind chaque zone de texte aux éléments App.MainViewModel. Définissez la liaison sur TwoWay si vous souhaitez que le ViewModel soit mis à jour dès que l'utilisateur manipule les données sur DetailsPage.xaml. Vous pouvez éventuellement définir la liaison sur OneWay, puis disposer d'un bouton OK qui réécrit les modifications dans ViewModel et enregistre dans IsolatedStorage.

Voici un exemple de ce à quoi ressemble une liaison:

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

Dans ce cas, LineOne est une propriété dans ItemViewModel et la page obtient ces données de la chaîne de requête lorsque l'utilisateur sélectionne un élément dans MainPage.xaml. Le DataContext de la page détermine d'où proviennent les informations liées aux données.

Voici l'extrait de code où le MainPage transmet l'élément sélectionné du ViewModel au 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 la 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];
    }
}

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

La beauté de la liaison de données et de l'ObservableCollection est que vous pouvez simplement mettre à jour les données et l'UX reflétera immédiatement ces changements. En effet, toute modification des données déclenche un événement:

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

NotifyPropertyChanged () qui diffuse ces informations à la vue.

2
Omar Shahine

comme je l'ai implémenté comme ça .. Que ce soit correct ou non, je ne sais pas ..

Lorsque vous cliquez sur la page de liste de nouvelles, il devrait ouvrir la page de détail des nouvelles. Je souhaite transmettre le contenu de l'élément d'actualité sélectionné de la page Liste des actualités à la page Détails des actualités.

la page Liste des actualités contient la méthode suivante.

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

Dans la page de détails des actualités. U peut accéder à cet objet (SelectedNewsItem).

Cela peut ou peut ne pas être correct.

1
Mahantesh

Une option consiste à utiliser Application.Resources:

Stocker les données:

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

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

Récupérer les données:

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

Voici un article de blog qui décrit cela plus en détail: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (auteur: moi)

1
Mikael Koskinen

Vous pouvez également rester simple et utiliser PhoneApplicationService.Current.State qui est essentiellement une table de hachage. Vous devrez implémenter votre propre marshaling vers et depuis le stockage isolé si vous voulez que quoi que ce soit survive à l'application.

La suggestion d'Omar d'utiliser le modèle de databound Windows Phone est probablement la meilleure idée sur cette page. Cela revient au même que ma suggestion, mais vous obtiendrez un meilleur résultat (code plus maintenable) au prix d'une courbe d'apprentissage plus raide.

Je vous suggère de le faire à ma façon puis de recommencer à la manière d'Omar.

1
Peter Wone