将数据从页面传递到页面
我正在寻找如何在页面之间传递数据的最佳做法。
在页面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对这些数据进行序列化和反序列化,以便跨应用程序会话和墓碑时保存。
在模板中,您将注意到MailViewModel和ItemViewModel 。 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/ (作者:我)