2011-02-10 26 views
44

私は、ページ間でデータを渡す方法に関するベストプラクティスを探しています。ページ間のデータ受け渡し

ページAページを起動するボタンがあります。
ページBページには、ユーザーが情報を入力できる6つのテキストボックスがあります。

    :ユーザーが実行されると は、ページAの

    に戻ってそれらをもたらすボタンをクリックすると、私はへの提案を見てきました

    ページAに戻って、そのデータを渡したいです

  • ビルドXML文書とプロパティ
  • に情報を格納するアプリケーションクラスを使用する分離ストレージへ
  • を保存し、クエリ文字列のよう
を渡します

ベストプラクティスを探しています。マイクロソフトが推奨するもの、または一般的に最も良い方法として受け入れられているものはありますか?あなたが考えることができ

おかげ

答えて

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

は、他のページで簡単に

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

ことの一つは、MVCを使用することです:モデル内のすべてのデータを保存し、あなたのアプリケーションはコントローラでみましょう、とページは、純粋なUIロジックが含まれているだけの図です。この場合、ページはペインタであり、モデルオブジェクトを渡します。これにより、ビジネスロジックとUIが素早く分離され、簡単にそれらを革新することができます。

ところで、SilverlightとXAMLはMVCに最適なツールなので、自然な一致です。

+0

MVCとWP7を使用してこのようなことを行う方法については、本当に簡単な例がありますか? – webdad3

+0

私は本当に簡単な例はありませんが、 "データバインドされたアプリケーション"テンプレートを始めて、それがどのように機能するか見るまで、私はちょうどそれを覗きました。 –

+1

これは(それがASPでありますけれども、それは実際にMVCについて非常によくデモ)あなたを助けるかもしれないhttp://agilewarrior.wordpress.com/2010/09/18/silverlight-model-view-controller-mvc-example/ –

3

ここにはいくつかのことがあります。まず、ユーザーがボタンの代わりに戻るボタンを使用してボタンの代わりにページAに戻ると、テキストボックスの情報が交換されたかどうか(戻る=キャンセル、または戻る= OKですか)

それはあなたがNavigationService.GoBackを使用している場合は、クエリ文字列(あなたがナビゲートコールを使用している場合、バックキーの連打は、ユーザーに悪いUXのすべての種類の原因となりますので、あなたが、代わりにNavigationService.Navigateであるべきである)、と述べましたオプションではありません。ページは実際にWP7 Silverlight navシステムで互いに参照する方法がないため、データを保持するためにサードパーティを使用する必要があります。そのためには、(a)Isolated Storage(slow &重いがフェールセーフ)、(b)PhoneApplicationService.State辞書を使用する、または(c)何らかの種類のグローバルプロパティを使用する、アプリケーションから離れたオブジェクトを使用するか、Statics/Singletonsを使用するかを指定します。

これを実行するときに、爆撃の動作を監視することを忘れないでください。 - ページがOnNavigatedToメソッドを処理します。(a)アプリケーションでその中にナビゲートします。ページBで作業を完了したとき、または(c)そのページからアプリを破棄し、戻るキーを使用してアプリケーションに戻ることができます。

申し訳ありませんが、私はそこに、より直接的な答えを与えていない - 多くはあなたの特定の状況に依存します。最も一般的なケースでは、PhoneApplicationServiceでApp State Dictionaryを使用することを強く検討しています...軽量で使いやすく、トゥームストーンに耐えることができます。あなたのキーは必要なだけユニークであることを確認してください。

+0

状態をクリアする方法はありますか?アプリケーションを再起動しなくても、新鮮な状態から始めたいとしましょう。 – webdad3

23

個人的に私はまた、ページAにアクセス可能であるモデル(オブジェクト)でページBに入力された値を格納したいです

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?:あなたはページAに二度目のナビゲートしているどのように

によっては、以下の1つ以上は、ページ間で値を渡す理解を助けるためにusfulかもしれ

How to pass a value between Silverlight pages for WP7?

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

2

新しいWindows Phoneプロジェクトを作成し、Windows Phoneデータバインドテンプレートを使用すると、ほとんどの作業が完了します。

あなたのアプリのすべてのデータを含むViewModelを設定します。 IsolatedStorageを使用してこのデータをシリアライズおよびデシリアライズして、アプリケーションセッション間およびトゥームストーン時に保存することができます。

テンプレートには、MailViewModelItemViewModelがあります。 MainViewModelには、アプリケーションに必要なすべてのデータ(ItemViewModelのObservableCollectionなど)が格納され、ItemViewModelにはアプリケーションの個々のデータ型が格納されます。

DetailsPage.xamlページでは、各テキストボックスをApp.MainViewModelアイテムにデータバインドする必要があります。ユーザーがDetailsPage.xamlのデータを操作するとすぐにViewModelを更新するには、バインディングをTwoWayに設定します。必要に応じてバインディングをOneWayに設定し、変更をViewModelに書き込んでIsolatedStorageに保存するOKボタンを使用することができます。この場合

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

LineOneはItemViewModelにおける財産であり、ユーザーがメインページから項目を選択したときにページがクエリ文字列からこのデータを取得します。ここでは

は様結合ルックスは何の例です。 .xaml。ページのDataContextは、データバインドされた情報がどこから来るかを決定します。

ここでは、MainPageが選択した項目をViewModelから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; 
} 

ここでは、DetailsPageが選択した項目を取得する方法を示します。

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

上記のデフォルトテンプレートを使用して周りを再生し、追加の質問をしてください。

データバインディングとObservableCollectionの美しさは、データを更新するだけで、UXはこれらの変更を即座に反映することができます。これは、データの変更によりイベントが発生するためです。

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

NotifyPropertyChanged()は、この情報をViewにブロードキャストします。

1

また、基本的にハッシュテーブルであるPhoneApplicationService.Current.Stateをシンプルにして使用することもできます。あなたは、アプリを使いこなすには、独立したストレージとの間でマーシャリングを実装する必要があります。 Windows Phoneのデータバインドテンプレートを使用する

オマールの提案は、おそらく、このページ上で最高のアイデアです。それは私の提案と同じですが、より長い急な学習曲線を犠牲にしてより良い結果(より保守的なコード)を得ることができます。

私はあなたがそれを私の方法を行うことを提案し、再度オマールの方法は、それを行います。

1

私は...このように実装されているかどうか、正しいかどうか私は...知らない

uはニュース一覧ページをクリックすると、それが開きますニュース詳細ページ。 ニュースリストページから選択したニュースアイテムのコンテンツをニュース詳細ページに渡したいと思います。

ニュースリストページには次の方法が含まれています。

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

ニュース詳細ページ。 Uはその(SelectedNewsItem)オブジェクトにアクセスできます。

これは正しくない場合があります。

1

1つのオプションは、Application.Resourcesを使用するようにされています。ここでブログ記事をより多くのでこれを説明します

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

ストアデータ:

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

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

は、データを取得します詳細:http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/(作成者:me)

関連する問題