Przekazywanie danych ze strony na stronę

Szukam najlepszych praktyk, jak przekazywać dane ze strony na stronę.

Na Stronie A mam przycisk, który odpala stronę B.
Na stronie B mam 6 pól tekstowych, które pozwalają użytkownikowi wprowadzić informacje. Gdy użytkownik zostanie ukończony, kliknij przycisk, który przywróci go do strony A.

Chcę przekazać te dane z powrotem na stronę A.

Widziałem propozycje do:

  • tworzenie dokumentów XML i zapisywanie do izolowanego magazynu
  • Użyj klasy aplikacji do przechowywania informacji we właściwościach
  • pass it like a query string

Szukam najlepszej praktyki. Czy jest taki, który zaleca Microsoft, czy taki, który jest ogólnie akceptowany jako najlepszy sposób?

Thanks

Author: ctacke, 2011-02-10

8 answers

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

Następnie na innej stronie po prostu

var k = PhoneApplicationService.Current.State["yourparam"];
 63
Author: LXG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 01:52:55

Osobiście przechowywałbym wartości wprowadzone na stronie B w modelu (obiekcie), który jest również dostępny na stronie A.

W zależności od sposobu przechodzenia do strony A po raz drugi, jedna lub więcej z poniższych opcji może pomóc zrozumieć przekazywanie wartości między stronami:

Jak przekazać wartość obrazu z jednej strony xaml do innej strony xaml w windows phone 7?

Przekazywanie złożonego obiektu do strony podczas nawigacji w Silverlight WP7 zastosowanie

Jak przekazać obiekt ze strony xaml do innej?

Jak przekazać wartość między stronami Silverlight dla WP7?

Jak przejść z jednej strony xaml do drugiej i przekazać wartości?

 23
Author: Matt Lacey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:00

Jedną rzeczą, którą możesz wziąć pod uwagę, jest użycie MVC: niech Twoja aplikacja będzie kontrolerem, przechowuje wszystkie dane w modelu, A strony są tylko widokami zawierającymi czystą logikę interfejsu użytkownika. W tym przypadku Twoje strony są malarzami i przekazujesz obiekt modelu. Daje to przyjemną izolację logiki biznesowej i interfejsu użytkownika, dzięki czemu można je łatwo włączyć.

BTW, Silverlight i XAML są świetnymi narzędziami do MVC więc jest to naturalne dopasowanie.

 4
Author: Peon the Great,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-10 04:52:25

Jest kilka rzeczy w grze tutaj. Po pierwsze, jeśli użytkownik użyje przycisku Wstecz, aby powrócić do strony A zamiast twojego przycisku, czy informacje w polach tekstowych są wymieniane, czy nie (is Back = Cancel, or is Back = OK?)

To znaczy, jeśli używasz NavigationService.GoBack (którym powinieneś być zamiast NavigationService.Nawiguj, bo jeśli użyjesz wywołania Nawiguj, powtarzające się trafienia klawisza Wstecz spowodują wszystkie rodzaje złego UX dla Twoich użytkowników), wtedy QueryStrings są nie ma takiej opcji. Ponieważ strony naprawdę nie mają możliwości odniesienia się do siebie w systemie WP7 Silverlight NAV, musisz użyć strony trzeciej do przechowywania danych. W tym celu możesz przejść do (a) izolowanego magazynu (powolnego i ciężkiego, ale awaryjnego), (b) Użyj usługi PhoneApplicationService.Słownik stanu, lub (c) używać globalnych właściwości jakiegoś rodzaju, albo zawieszone na obiekcie aplikacji, lub za pomocą statyki / Singletons...

Pamiętaj, aby uważać na zachowanie Tombstoning, gdy to zrobisz - Twoja strona będzie przetworzyć metodę OnNavigatedTo, gdy (a) wejdziesz do niej w aplikacji (b) wrócisz do niej po zakończeniu pracy na stronie B lub (c) usuniesz aplikację z tej strony i wrócisz do aplikacji za pomocą klawisza Wstecz.

Przepraszam, że nie podałem tam bardziej bezpośredniej odpowiedzi - wiele zależy od konkretnych okoliczności. W najbardziej ogólnym przypadku zdecydowanie rozważyłbym użycie App State Dictionary na PhoneApplicationService...it jest lekki, łatwy w użyciu, i przeżywa tombstoning. Po prostu upewnij się, że Twoje klucze są tak wyjątkowe, jak muszą być.

 3
Author: John Garland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-10 05:01:53

Jeśli utworzysz nowy projekt Windows Phone i użyjesz szablonu bazy danych Windows Phone Databound , większość pracy wykonasz za siebie.

To, co chcesz zrobić, to skonfigurować model widoku, aby zawierał wszystkie dane dla Twojej aplikacji. Możesz serializować i deserializować te dane za pomocą IsolatedStorage, aby były zapisywane w sesjach aplikacji i podczas Tombstoning.

W szablonie zauważysz MailViewModel i ItemViewModel . MainViewModel stores wszystkie dane, których potrzebuje Twoja aplikacja, w tym obserwowalna Kolekcja ItemViewModel i ItemViewModel reprezentuje indywidualny typ danych dla Twojej aplikacji.

Na szczegółach.strona xaml, na której będziesz chciał dopasować każde pole tekstowe do aplikacji.MainViewModel Items. Ustaw powiązanie na TwoWay, jeśli chcesz, aby ViewModel był aktualizowany, gdy tylko użytkownik manipuluje danymi na DetailsPage.xaml. Możesz opcjonalnie ustawić powiązanie na OneWay, a następnie mieć przycisk OK, który zapisuje zmiany wróć do ViewModel i zapisz do IsolatedStorage.

Oto przykład jak wygląda Oprawa:

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

W tym przypadku lineone jest właściwością w ItemViewModel i strona pobiera te dane z łańcucha zapytania, gdy użytkownik wybierze element ze strony głównej.xaml. DataContext dla strony określa, skąd pochodzą informacje z bazy danych.

Oto fragment, w którym Strona główna przekazuje wybrany element z ViewModel do Szczegóły.

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

Oto jak DetailsPage otrzymuje wybrany element.

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

Pobaw się z domyślnym szablonem powyżej i zadaj dodatkowe pytania.

Piękno databinding i ObservableCollection jest to, że można po prostu zaktualizować dane i UX będzie odzwierciedlać te zmiany natychmiast. Dzieje się tak, ponieważ wszelkie zmiany w danych wywołują Zdarzenie:

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

NotifyPropertyChanged (), która przekazuje tę informację do widoku.

 2
Author: Omar Shahine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-10 16:01:47

Możesz również zachować to proste i korzystać z Phoneaplicationservice.Aktualne.Stan, który jest w zasadzie hashtable. Jeśli chcesz, aby cokolwiek przeżyło aplikację, musisz zaimplementować własne przekierowanie do iz izolowanej pamięci masowej.

Sugestia Omara, aby użyć szablonu Windows Phone Databound jest prawdopodobnie najlepszym pomysłem na tej stronie. Jest to to samo, co moja sugestia, ale uzyskasz lepszy wynik (bardziej możliwy do utrzymania kod) kosztem dłuższego stromego uczenia się krzywa.

Proponuję zrobić to po mojemu, a potem zrobić to po swojemu.

 1
Author: Peter Wone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 09:43:11

Jak to zaimplementowałem.. Czy to poprawne, czy Nie, Nie wiem..

Po kliknięciu strony listy wiadomości powinna otworzyć stronę szczegółów wiadomości. Chcę przekazać wybraną treść wiadomości ze strony Lista wiadomości do strony szczegóły wiadomości.

Strona listy wiadomości zawiera następującą metodę.

 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 stronie szczegółów wiadomości. U można uzyskać dostęp do tego obiektu (SelectedNewsItem).

To może być, ale nie musi być poprawne.

 1
Author: Shashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-12 12:27:23

Jedną z opcji jest użycie aplikacji.Zasoby:

Dane sklepu:

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

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

Pobierz DANE:

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

Oto wpis na blogu z opisem tego bardziej szczegółowo: http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/ (autor: ja)

 1
Author: Mikael Koskinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 08:52:49