我正在尋找關於如何在頁面間傳遞數據的最佳實踐。從頁面到頁面傳遞數據
在頁面A我有一個按鈕,關閉頁面B.
在頁面B我有6個文本框允許用戶輸入信息。 當用戶完成,帶來他們回到頁面A.
上的按鈕,點擊我要傳遞的數據返回到頁面A.
我見過的建議:
- 構建XML文檔並保存到獨立存儲
- 使用App類來存儲屬性的信息
- 傳像查詢字符串
我正在尋找最佳實踐。是否有微軟推薦的或通常被認爲是最好的方法?
感謝你可以考慮
我正在尋找關於如何在頁面間傳遞數據的最佳實踐。從頁面到頁面傳遞數據
在頁面A我有一個按鈕,關閉頁面B.
在頁面B我有6個文本框允許用戶輸入信息。 當用戶完成,帶來他們回到頁面A.
上的按鈕,點擊我要傳遞的數據返回到頁面A.
我見過的建議:
我正在尋找最佳實踐。是否有微軟推薦的或通常被認爲是最好的方法?
感謝你可以考慮
PhoneApplicationService.Current.State["yourparam"] = param
NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative));
然後在其他頁面只是
var k = PhoneApplicationService.Current.State["yourparam"];
一件事是使用MVC:讓您的應用控制器,所有的數據存儲模型,並且頁面包含純UI邏輯只是意見。在這種情況下,你的頁面是畫家,你傳遞你的模型對象。這可以很好地隔離業務邏輯和用戶界面,以便您可以輕鬆地進行修改。
順便說一句,Silverlight和XAML是MVC的絕佳工具,所以這是很自然的搭配。
這裏有一些東西在玩。首先,如果/當用戶使用後退按鈕返回到頁面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 ...它輕巧,易於使用,並且能夠在墓碑中生存下來。只要確定你的鑰匙是獨一無二的。
就我個人而言,我會將頁面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?
如果您創建一個新的Windows Phone項目並使用Windows Phone Databound Template您將完成大部分工作。
你想要做的就是設置ViewModel來包含你的應用程序的所有數據。您可以使用IsolatedStorage對這些數據進行序列化和反序列化,以便跨應用程序會話和墓碑時保存它們。
在模板中,你會發現MailViewModel和ItemViewModel。 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(。
你也可以保持簡單並使用基本上是散列表的PhoneApplicationService.Current.State。如果您想要任何超出應用程序的範圍,您需要實現自己的隔離存儲編組。
奧馬爾建議使用Windows Phone Databound模板可能是此頁面上的最佳主意。它和我的建議相同,但是你會得到一個更好的結果(更可維護的代碼),代價是更長的學習曲線。
我建議你按我的方式做,然後再做一次奧馬爾的方式。
爲我實現這樣的..無論其正確與否我不知道..
當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)對象。
這可能是也可能不是正確的。
一種選擇是使用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/(作者:我)
有沒有一個真正簡單的例子,說明如何使用MVC和WP7做類似的事情? – webdad3 2011-02-10 05:12:11
我沒有一個非常簡單的例子,但是我剛開始使用「數據綁定應用程序」模板,並且直到我看到它的工作原理。 – 2011-02-10 05:19:18