Windows phone 7 将数据从一页传递到另一页

Windows phone 7 将数据从一页传递到另一页,windows-phone-7,Windows Phone 7,我正在寻找如何在页面之间传递数据的最佳实践 在A页中,我有一个按钮可以触发B页。 在B页上,我有6个文本框,允许用户输入信息。 当用户完成后,点击一个按钮将他们带回页面a 我想把数据传回A页 我看到了以下建议: 构建XML文档并保存到独立存储 使用App类在属性中存储信息 像查询字符串一样传递它 我在寻找最佳实践。有微软推荐的还是公认的最佳方式 谢谢可以考虑的是使用MVC:让你的应用程序成为控制器,将所有数据存储在模型中,页面只是包含纯UI逻辑的视图。在这种情况下,您的页面是画家,您可以传递

我正在寻找如何在页面之间传递数据的最佳实践

在A页中,我有一个按钮可以触发B页。
在B页上,我有6个文本框,允许用户输入信息。 当用户完成后,点击一个按钮将他们带回页面a

我想把数据传回A页

我看到了以下建议:

  • 构建XML文档并保存到独立存储
  • 使用App类在属性中存储信息
  • 像查询字符串一样传递它
我在寻找最佳实践。有微软推荐的还是公认的最佳方式


谢谢

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


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

这里有一些东西在起作用。首先,如果/当用户使用后退按钮而不是您的按钮返回A页时,文本框中的信息是否交换(后退=取消,还是后退=确定?)

也就是说,如果您使用的是NavigationService.GoBack(您应该使用它而不是NavigationService.Navigate,因为如果您使用Navigate调用,反复点击back键将导致用户出现各种不良用户体验),那么QueryString就不是一个选项。由于在WP7 Silverlight导航系统中,页面实际上无法相互引用,因此需要使用第三方来保存数据。为此,您可以转向(a)隔离存储(速度慢、容量大,但故障安全),(b)使用PhoneApplicationService.State字典,或(c)使用某种类型的全局属性,或者挂起应用程序对象,或者使用静态/单例

记住在执行此操作时要注意逻辑删除行为-当(a)您在应用程序中导航到它时,页面将处理OnNavigatedTo方法(b)您在完成页面b上的工作时导航回它,或者(c)您从该页面逻辑删除应用程序并使用back键返回应用程序


很抱歉,我没有给出更直接的回答,这在很大程度上取决于你的具体情况。在最一般的情况下,我强烈考虑在PooPealService服务上使用App State字典…它轻量级,易于使用,并且可以保存在墓碑上。只需确保您的键具有所需的唯一性。

就我个人而言,我会将B页上输入的值存储在a页也可以访问的模型(对象)中

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


如果您创建一个新的Windows Phone项目并使用Windows Phone数据绑定模板,您将完成大部分工作

您需要做的是将ViewModel设置为包含应用程序的所有数据。您可以使用IsolatedStorage序列化和反序列化此数据,以便在应用程序会话和逻辑删除时保存它

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

在DetailsPage.xaml页面上,您需要将每个文本框数据绑定到App.MainViewModel项。如果希望在用户操作DetailsPage.xaml上的数据时立即更新ViewModel,请将绑定设置为双向。您可以选择将绑定设置为单向,然后使用“确定”按钮将更改写回ViewModel并保存到IsolatedStorage

下面是一个绑定的示例:

<TextBlock x:Name="ListTitle" Text="{Binding LineOne}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
下面是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数据绑定模板可能是本页的最佳想法。这与我的建议相同,但您将以更长更陡峭的学习曲线为代价获得更好的结果(更易于维护的代码)

我建议你按照我的方式做,然后再按照奥马尔的方式做

PhoneApplicationService.Current.State["yourparam"] = param
NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative));
然后在另一页简单地

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

当我像这样实现时。。我不知道它是否正确

当你点击新闻列表页面时,它会打开新闻详情页面。 我想将所选新闻项内容从新闻列表页面传递到新闻详细信息页面

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

 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);
    }
在新闻详情页面。您可以访问(SelectedNewsItem)对象


这可能正确,也可能不正确。

一个选项是使用应用程序。参考资料:

存储数据:

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

NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
var customers = (List<Customer>) Application.Current.Resources["NavigationParam"];
检索数据:

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

NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
var customers = (List<Customer>) Application.Current.Resources["NavigationParam"];
var customers=(List)Application.Current.Resources[“NavigationParam”];

这里有一篇博客文章更详细地描述了这一点:(作者:我)

有没有一个非常简单的例子来说明我如何使用MVC和WP7做类似的事情?我没有一个非常简单的例子,但我刚刚启动了“数据绑定应用”templa