【问题标题】:Navigation QueryString vs. PhoneApplicationService.Current.State导航 QueryString 与 PhoneApplicationService.Current.State
【发布时间】:2013-01-11 04:29:08
【问题描述】:

我正在为我的 Windows Phone 8 应用程序使用 NavigationContext.QueryString。例如,我在导航字符串和 OnNavigatedTo 中设置了一个类似 ItemId 的 URI 标识符,我解析 Id 并通过 linq 读取 Item。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        try
        {
            int itemId = int.Parse(NavigationContext.QueryString["itemId"]);

            _item = App.MainViewModel.GetItem(itemId);

            DataContext = _item;
        }
        catch (KeyNotFoundException ex)
        {
            Debug.WriteLine(ex.Message);
            throw;
        }
    }

我找到了一个有趣的替代方案,想听听您的意见:

// in the calling page
PhoneApplicationService.Current.State["Item"] = App.MainViewModel.GetItem(123);

// in the destination page
Item item = PhoneApplicationService.Current.State["Item"] as Item;

这真的是推荐的方式吗?

【问题讨论】:

    标签: c# windows-phone-7 windows-phone-8


    【解决方案1】:

    来自MSDN

    PhoneApplicationService 类提供对各个方面的访问 应用程序的生命周期。这包括管理 应用程序的空闲行为和应用程序状态的管理 当它变得活跃或不活跃时。你可以这样使用它,但是 数据必须是可序列化的。

    这个link 有其他方式来共享数据,但我不认为 state 是推荐的方式。更多是为了墓碑目的。

    【讨论】:

    • 如果引用 MSDN,请添加对它的引用。
    • 我目前的解决方案是更好的方法吗?我不确定,因为在导航之前我已经有了对象,但我需要在每一页中阅读它们。
    • @websocialist 我相信您的解决方案更加灵活,因为它允许您在导航堆栈中拥有同一页面的多个实例。如果您使用状态,当您导航到具有新 id 的页面的新实例时,该 id 也会在以前的实例中被替换,因为状态是共享的。您的解决方案可让您在需要时轻松固定页面。
    • 这是一个很好的论点!但是我从 MainViewModel 检索项目的方式是什么。我当前的解决方案是一个简单的 GedItem 方法,如果未创建 Item 则会引发异常。也许 TryGetItem 方法是更好的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2018-11-02
    • 2022-11-14
    • 2013-05-16
    • 2011-12-27
    相关资源
    最近更新 更多