【问题标题】:Deep linking/Navigating to tabbed page in prism not working深度链接/导航到棱镜中的标签页不起作用
【发布时间】:2016-08-12 08:29:14
【问题描述】:

我有一个主详细信息页面作为我的应用程序的根页面。作为详细信息页面,我有一个标签页。在选项卡式页面中,我有一个内容页面和一个包含一个内容页面的导航页面。在主详细信息的 OnNavigatedTo 中,我正在从云中检索一些组织数据,然后我想导航到管理组织页面,该页面是选项卡式页面中的纯内容页面。

使用 NavigateAsync 和管理组织页面的相对 uri,我发现选项卡式页面 OnNavigatedTo 被点击了两次,然后我得到一个异常,如下面的(简化)。我还可以在输出中看到绑定错误,显示我的管理组织页面 xaml 上的元素试图绑定到选项卡式页面视图模型。

我不确定这是否是 6.2 中视图模型自动换线的问题,或者是深层链接问题,还是我做错了什么。

"Sequence contains no elements".

at System.Linq.Enumerable.Last[TSource] (IEnumerable`1 source) [0x00079] 
at Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.OnAttachedToWindow () [0x00011]
in C:\BuildAgent\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:189

使用 XF 2.3.1.114、Prism.Forms 6.2,我不确定其他包是否相关。如果你这么认为,我可以将它们包括在内。

另外有趣的是,如果我尝试从主详细信息(即“TabbedPage/NavigationPage/ContentPage”)导航到导航页面中的内容页面,它会起作用。

任何想法可能是什么问题?

【问题讨论】:

  • 这里有很多动人的片段和复杂的页面结构。它可能是导致您的问题的任何数量的事情。你能提供一个重现问题的小样本吗?此外,请确保您的所有页面都已注册导航。如果您的 TabbedPage 中有一个未注册的页面,那么它将无法找到它。
  • @BrianLagunas 感谢您的回复。我在这里创建了一个示例,它至少在我的机器上复制了这个问题。 github.com/Troto/PrismJunkApp
  • 我试图通过导航到不同的页面然后只是返回,但似乎视图模型没有连接到视图来解决它。所以我对那个页面无能为力。

标签: c# xamarin.forms prism


【解决方案1】:

首先,您的 TabbedPage 没有正确的 XAML 语法。在 XAML 中为 NavigationPage 定义默认页面时,您必须通过 Arguments 元素提供该页面:

  <views:SimpleNavPage Title="Foo">
       <x:Arguments>
            <views:NestedContentPage />
       </x:Arguments>
  </views:SimpleNavPage>

您的导航页面中还必须有正确的 ctor:

    public SimpleNavPage(Page root) : base (root)
    {
        InitializeComponent();
    }

现在,我个人不建议在 OnNavigatedTo 中导航,除非您可以绝对保证不会在另一个深层链接或导航场景中添加该页面。想象一下,您从 NavigateAsync("MainPage") 开始,并且有一个 OnNavigatedTo 执行深度链接导航操作。现在您决定从 OnNavigatedTo 中的 NavigateAsync("SomeOtherPage") 中进行 NavigateAsyc("AnotherPage/MainPage/SomeOtherPage/LastPage")。现在,您将创建一个问题,因为 MainPage.OnNavigatedTO 将启动另一个导航操作,而您仍在导航到下一个“SomeOtherPage”。你是在自找麻烦。

【讨论】:

  • 它仍然无法正常工作。我做了你建议的修复,谢谢。但我仍然遇到内容页面绑定到错误视图模型的问题。它使用选项卡式页面视图模型而不是它自己的视图模型。这也不是使用 OnNavigatedTo,而是使用来自应用程序的绝对导航。我已经更新了我的示例 repo 来演示这个。
  • 是的,它正在工作,只是您没有将 prism:ViewModelLocator.AutowireViewModel="True" 添加到页面。
  • 有趣,我以为你是自动完成的。我已将其从其他所有页面中删除,它们仍然有效。这是与恢复的工作。为什么在这种情况下需要它?
  • 我确实让它自动化了。老实说,我不确定为什么它不能自动适用于这个特定页面。我得调查一下。如果您明确添加附加属性,至少它会起作用:)
  • 好的,甜。我很高兴我没有错过什么哈哈。谢谢你的帮助!回首往事,我不小心在标签页上明确表示,因为我使用的是模板包。也许是一个明确的破坏了它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 2013-02-12
  • 2012-03-16
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多