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

如何将对象从xaml页面传递到另一个页面?,xaml,windows-phone-7,Xaml,Windows Phone 7,将值传递到另一个xaml页面可以使用 NavigationService.Navigate(新Uri(“/SecondPage.xaml?msg=“+textBox1.Text,UriKind.Relative)) 但这仅适用于字符串值。我想向xaml页面传递一个对象。我该怎么做 在SO和WP7论坛上发现了类似的问题。解决方案是使用全局变量(不是最好的解决方案) 我建议你看看Caliburn.Micro 查看启动新数据绑定项目时创建的默认代码。它显示了将对选定对象的引用传递到详细信息页面的方法

将值传递到另一个xaml页面可以使用

NavigationService.Navigate(新Uri(“/SecondPage.xaml?msg=“+textBox1.Text,UriKind.Relative))

但这仅适用于字符串值。我想向xaml页面传递一个对象。我该怎么做

在SO和WP7论坛上发现了类似的问题。解决方案是使用全局变量(不是最好的解决方案)


我建议你看看Caliburn.Micro


查看启动新数据绑定项目时创建的默认代码。它显示了将对选定对象的引用传递到详细信息页面的方法。

使用OnNavigatedFrom方法

当我们调用NavigationService.Navigate方法时,会调用OnNavigateFrom。它有一个NavigationEventArgs对象作为参数,返回目标页面及其内容属性,我们可以使用该属性访问目标页面“DestinationPage.xaml.cs”的属性

首先,在目标页面“DestinationPage.xaml.cs”中声明一个属性“SomeProperty”:

现在,在“MainPage.xaml.cs”中,重写OnNavigatedFrom方法:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// NavigationEventArgs returns destination page "DestinationPage"
    DestinationPage dPage = e.Content as DestinationPage;
    if (dPage != null)
    {
        // Change property of destination page 
        dPage.SomeProperty = new ComplexObject();
    }
}
现在,在“DestinationPage.xaml.cs”中获取SomeProperty值:


谢谢,我将研究这个框架(已经听过好几次了)。您知道它是否可以将对象传递给页面吗?绑定到后面的ViewModel/Presenter/Controller/Screen可能会解决这个问题!谢谢默认项目通过查询字符串间接传递对象,然后从
App.ViewModel
进行访问。这会起作用,但我希望有一个更优雅的解决方案,直接传递对象。我认为没有优雅的解决方案,所以必须采用这种间接方式。否则,请使用框架。有一个优雅的解决方案,请看我的回答。虽然这种方法可以将引用传递到目标页面,但当目标释放控件返回到源页面时,在源页面中接收相同的引用将不起作用。在将控件返回到源页面后,无法保证目标页面的引用有效。一般来说,唯一真正的解决方案是在当前应用程序对象(application.current)中存储一个共享对象引用,源页面和目标页面都可以访问该对象,并保证在应用程序实例的生命周期内始终保持有效。我的回答对所述问题有效。我建议您将您的场景转换为一个问题(使用代码),并且我将尝试在不使用丑陋的全局in-Application.Current的情况下回答它(到目前为止,我一直能够避免它们)
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// NavigationEventArgs returns destination page "DestinationPage"
    DestinationPage dPage = e.Content as DestinationPage;
    if (dPage != null)
    {
        // Change property of destination page 
        dPage.SomeProperty = new ComplexObject();
    }
}
private void DestinationPage_Loaded(object sender, RoutedEventArgs e)
{
    // This will display a the Name of you object (assuming it has a Name property)
    MessageBox.Show(this.SomeProperty.Name);
}