【问题标题】:How to pass an object from a xaml page to another? [duplicate]如何将对象从 xaml 页面传递到另一个页面? [复制]
【发布时间】:2010-11-29 09:06:01
【问题描述】:

使用

可以轻松地将值传递给另一个 xaml 页面

NavigationService.Navigate(new Uri("/SecondPage.xaml?msg=" + textBox1.Text, UriKind.Relative));

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

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

WP7: Pass parameter to new page?

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

【问题讨论】:

    标签: xaml windows-phone-7


    【解决方案1】:

    使用 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) 中存储一个共享对象引用,源页面和目标页面都可以访问它,并且保证在应用程序的生命周期内始终保持有效实例。
    • 我的回答对所述问题有效。我建议您将您的场景转换为一个问题(使用代码),我会尝试在 Application.Current 中不使用丑陋的全局来回答它(到目前为止,我一直能够避免它们)
    【解决方案2】:

    看看当你开始一个新的数据绑定项目时创建的默认代码。它显示了一种将对选定对象的引用传递到详细信息页面的方法。

    【讨论】:

    • 谢谢。默认项目通过查询字符串间接传递对象,然后从App.ViewModel 访问。这会起作用,但我希望有一个更优雅的直接传递对象的解决方案。
    • 我认为没有优雅的解决方案,所以必须采用这种间接方式。否则,请使用框架。
    • 有一个优雅的解决方案,请看我的回答
    【解决方案3】:

    我推荐看看 Caliburn.Micro!

    http://caliburnmicro.codeplex.com

    【讨论】:

    • 谢谢 我会研究这个框架(听过几次)。你知道它是否可以将对象传递给页面吗?
    • 绑定到后面的 ViewModel/Presenter/Controller/Screen 应该可以解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2011-12-04
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多