2011-02-10 127 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/(作者:我)