如何在XAML页面之间传递对象?

3
传递值到另一个xaml页面可以通过以下方式轻松完成: NavigationService.Navigate(new Uri("/SecondPage.xaml?msg=" + textBox1.Text, UriKind.Relative)); 但这仅适用于字符串值。我想传递一个对象到xaml页面。我该怎么做?
在SO和WP7论坛上找到了类似的问题。解决方案是使用全局变量(不是最好的解决方案)。 WP7:如何将参数传递给新页面?

http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/81ca8713-809a-4505-8422-000a42c30da8

3个回答

5

使用OnNavigatedFrom方法

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

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

public ComplexObject SomeProperty { get; set; }

现在,在“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的值:
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);
}

虽然这种方法可以用于传递到目标页面的引用,但当目标页面将控制权释放回源页面时,它将无法接收相同的引用。不能保证在返回控制权到源页面后,目标页面的引用仍然有效。一般来说,唯一真正的解决方案是在当前应用程序对象(Application.Current)中存储共享对象引用,源页面和目标页面都可以访问该引用,并且在应用程序实例的生命周期内始终保持有效。 - Mark Jones
我的答案适用于所述问题。我建议您将您的场景转化为一个问题(带有代码),我会尝试回答它,而不使用Application.Current中的丑陋全局变量(到目前为止,我总是能够避免它们)。 - Luxspes

3

看一下创建新的DataBound项目时默认生成的代码。它展示了一种将选定对象的引用传递到详细页面的方法。


谢谢。默认项目通过查询字符串间接传递对象,然后从 App.ViewModel 访问该对象。这样可以工作,但我希望有一个更优雅的解决方案,直接传递对象。 - samwize
我认为没有更优雅的解决方案,所以必须采用这种间接的方法。否则,使用一个框架。 - samwize
有一个优雅的解决方案,请看我的答案。 - Luxspes

1

谢谢,我会研究一下这个框架(听说过几次)。你知道它是否可以将对象传递给页面吗? - samwize
绑定到 ViewModel/Presenter/Controller/屏幕后面的内容应该由它来管理! - user523650

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接