2011-02-10 207 views
44

我正在尋找關於如何在頁面間傳遞數據的最佳實踐。從頁面到頁面傳遞數據

在頁面A我有一個按鈕,關閉頁面B.
在頁面B我有6個文本框允許用戶輸入信息。 當用戶完成,帶來他們回到頁面A.

上的按鈕,點擊我要傳遞的數據返回到頁面A.

我見過的建議:

  • 構建XML文檔並保存到獨立存儲
  • 使用App類來存儲屬性的信息
  • 傳像查詢字符串

我正在尋找最佳實踐。是否有微軟推薦的或通常被認爲是最好的方法?

感謝你可以考慮

回答

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

然後在其他頁面只是

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

一件事是使用MVC:讓您的應用控制器,所有的數據存儲模型,並且頁面包含純UI邏輯只是意見。在這種情況下,你的頁面是畫家,你傳遞你的模型對象。這可以很好地隔離業務邏輯和用戶界面,以便您可以輕鬆地進行修改。

順便說一句,Silverlight和XAML是MVC的絕佳工具,所以這是很自然的搭配。

+0

有沒有一個真正簡單的例子,說明如何使用MVC和WP7做類似的事情? – webdad3 2011-02-10 05:12:11

+0

我沒有一個非常簡單的例子,但是我剛開始使用「數據綁定應用程序」模板,並且直到我看到它的工作原理。 – 2011-02-10 05:19:18

3

這裏有一些東西在玩。首先,如果/當用戶使用後退按鈕返回到頁面A而不是按鈕時,文本框中的信息是否已交換(是Back = Cancel,還是Back = OK?)

也就是說,如果您使用的是NavigationService.GoBack(您應該使用NavigationService.Navigate而不是NavigationService.Navigate,因爲如果使用Navigate調用,重複使用後鍵將導致用戶使用各種不良UX),那麼QueryStrings不是一種選擇。由於WP7 Silverlight導航系統中的頁面確實無法互相引用,因此您需要使用第三方來保存數據。爲此,您可以轉向(a)孤立存儲(緩慢的&沉重的,但安全的),(b)使用PhoneApplicationService.State字典,或者(c)使用某種類型的全局屬性,掛起應用程序對象,或使用靜態/單身...

當你這樣做時,記得注意墓碑行爲 - 當你在你的應用程序中導航到你的應用程序時,你的頁面將處理OnNavigatedTo方法(b)當你在頁面B上完成你的工作時,或者(c)你從該頁面中刪除你的應用程序並使用後退鍵返回到你的應用程序。

對不起,我沒有給出更直接的答案 - 很大程度上取決於您的具體情況。在最一般的情況下,我會強烈考慮在PhoneApplicationService上使用App State Dictionary ...它輕巧,易於使用,並且能夠在墓碑中生存下來。只要確定你的鑰匙是獨一無二的。

23

就我個人而言,我會將頁面B上輸入的值存儲在模型(對象)中,頁面A也可以訪問它們。

取決於你如何瀏覽網頁A第二次,一個或多個以下可能usful幫助理解頁面之間傳遞值:

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?

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 Databound Template您將完成大部分工作。

你想要做的就是設置ViewModel來包含你的應用程序的所有數據。您可以使用IsolatedStorage對這些數據進行序列化和反序列化,以便跨應用程序會話和墓碑時保存它們。

在模板中,你會發現MailViewModelItemViewModel。 MainViewModel存儲應用程序需要的所有數據,包括ItemViewModel的ObservableCollection,而ItemViewModel表示應用程序的單個數據類型。

在DetailsPage.xaml頁面上,您需要將每個文本框的DataBind都綁定到App.MainViewModel項目。如果希望在用戶在DetailsPage.xaml上操作數據時立即更新ViewModel,請將綁定設置爲TwoWay。您可以選擇將Binding設置爲OneWay,然後使用OK按鈕將更改寫回ViewModel並保存到IsolatedStorage。

下面是一個例子什麼是綁定的樣子:

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

在這種情況下LineOne是ItemViewModel一個屬性,當用戶從的MainPage選擇一個項目的頁面會從查詢字符串這個數據的.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的美妙之處在於,您只需更新數據即可立即反映這些更改。這是因爲數據打完事件的任何變化:)是廣播該信息的查看

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

NotifyPropertyChanged(。

1

你也可以保持簡單並使用基本上是散列表的PhoneApplicationService.Current.State。如果您想要任何超出應用程序的範圍,您需要實現自己的隔離存儲編組。

奧馬爾建議使用Windows Phone Databound模板可能是此頁面上的最佳主意。它和我的建議相同,但是你會得到一個更好的結果(更可維護的代碼),代價是更長的學習曲線。

我建議你按我的方式做,然後再做一次奧馬爾的方式。

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

一種選擇是使用Application.Resources:

存儲數據:

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

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

檢索數據:

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

這裏有一個博客帖子有更多的描述了這個詳細信息:http://mikaelkoskinen.net/windows-phone-pass-data-between-pages-application-resources/(作者:我)

相關問題