将数据从页面传递到页面

我正在寻找如何在页面之间传递数据的最佳做法。

在页面AI中有一个button,可以closures页面B.
在页面BI上有6个文本框允许用户input信息。 当用户完成后,点击一个button,将他们带回到页面A.

我想将这些数据传回给PageA

我见过的build议是:

  • 构buildXML文档并保存到独立存储
  • 使用App类将信息存储在属性中
  • 像查询string一样传递它

我正在寻找最佳做法。 是否有微软推荐的或者被普遍认为是最好的方法?

谢谢

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

然后在其他页面简单地

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

就个人而言,我会将页面B上input的值存储在模型(对象)中,页面A也可以访问它们。

根据您第二次浏览页面A的方式,以下一项或多项可能有助于理解页面之间的值传递:

如何将一个xaml页面中的图像值传递给Windows Phone 7中的另一个xaml页面?

在WP7 Silverlight应用程序中导航时,将复杂的对象传递给页面

如何将一个对象从一个xaml页面传递给另一个?

如何在WP7的Silverlight页面之间传递一个值?

如何从一个xaml页面导航到另一个页面,并传递值?

有一件事你可以考虑使用MVC:让你的应用程序成为控制器,将所有数据存储在模型中,而页面只是包含纯UI界面逻辑的视图。 在这种情况下,你的页面是画家,你传递你的模型对象。 这给业务逻辑和用户界面提供了很好的隔离,以便您可以轻松地进行修改。

顺便说一句,Silverlight和XAML是MVC的伟大工具,所以这是一个自然的匹配。

这里有几件事情。 首先,如果/当用户使用返回button返回到页面A而不是button时,是否在文本框中交换信息(是Back = Cancel,还是Back = OK?)

也就是说,如果您使用的是NavigationService.GoBack(您应该使用NavigationService.Navigate而不是NavigationService.Navigate,因为如果使用Navigate调用,则重复使用后面的键会导致用户使用各种不良UX),那么QueryStrings不是一个选项。 由于WP7 Silverlight导航系统中的页面实际上无法相互引用,因此您需要使用第三方来保存数据。 (b)使用PhoneApplicationService.State字典,或者(c)使用某种types的全局属性,或者挂在应用程序之外对象,或使用静态/单身…

(a)在应用程序中导航到(b)当您在页面B上完成工作时导航回到它,或者(c)在页面B上完成工作时,您的页面将处理OnNavigatedTo方法。您从该页面中删除您的应用程序并使用后退键返回到您的应用程序。

对不起,我没有给出更直接的答案 – 很大程度上取决于你的具体情况。 在最一般的情况下,我会强烈考虑使用PhoneApplicationService上的App State Dictionary …它是轻量级的,易于使用,并且能够存活墓碑。 只要确定你的钥匙是独一无二的。

如果您创build一个新的Windows Phone项目并使用Windows Phone Databound模板 ,则将为您完成大部分工作。

你想要做的是设置ViewModel来包含你的应用程序的所有数据。 您可以使用IsolatedStorage对这些数据进行序列化和反序列化,以便跨应用程序会话和墓碑时保存。

在模板中,您将注意到MailViewModelItemViewModel 。 MainViewModel存储应用程序需要的所有数据,包括ItemViewModel的ObservableCollection,ItemViewModel表示应用程序的单个数据types。

在DetailsPage.xaml页面上,您需要DataBind每个文本框到App.MainViewModel项目。 如果希望在用户在DetailsPage.xaml上操作数据时立即更新ViewModel,请将绑定设置为TwoWay。 您可以select将Binding设置为OneWay,然后使用OKbutton将更改写回到ViewModel并保存到IsolatedStorage。

下面是一个Binding的例子:

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

在这种情况下,LineOne是ItemViewModel中的一个属性,当用户从MainPage.xaml中select一个项目时,页面从查询string中获取这些数据。 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()将这些信息广播给View。

你也可以保持简单,并使用基本上是散列表的PhoneApplicationService.Current.State。 如果你想要任何东西超过应用程序,你将需要实现你自己的隔离存储编组。

奥马尔build议使用Windows Phone Databound模板可能是这个页面上最好的主意。 它和我的build议相同,但是你会得到一个更好的结果(更可维护的代码),代价是更长的学习曲线。

我build议你按照我的方式做,然后再做一次奥马尔的方式。

像我这样实施..是否正确或不我不知道..

当你点击新闻列表页面时,应该打开新闻详细页面。 我想将select的新闻项目内容从新闻列表页面传递到新闻细节页面。

新闻列表页面包含以下方法。

  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)对象。

这可能是也可能不是正确的。

一个select是使用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/ (作者:我)