【问题标题】:Prism for Xamarin.Forms unable to AutoWireXamarin.Forms 的 Prism 无法自动连线
【发布时间】:2016-09-20 01:55:13
【问题描述】:

我正在为我的下一个客户项目试用 Prism.Forms。不幸的是,我发现我的样本出现了奇怪的行为。

借口 似乎 XF 或 Prism 不喜欢我,包括现有的 XAML 页面(Brian Lagunas - The man - 他自己在 Evolve 会议上也提到过)。但是重命名页面也会将其丢弃,并且 ViewModelLocator 似乎无法再找到 ViewModel。即使我重新创建具有相同名称的页面,它也无法找到它 ViewModel。手动设置 BindingContext 有效,但我试图不为构造函数注入创建依赖项。

问题 在处理现有代码时,使用 NavigationPage 作为根时,一个小的更改会导致 NullReference 异常。这是一个工作示例应用程序的示例

https://github.com/hnabbasi/xamarin/tree/master/XFPrism/XFPrism

我正在使用 NavigationPage 并推送 ContentPage。然后我推送另一个 ContentPage,然后通过按钮单击和通信显示一个模态页面。我通过 NavigationParameters 将参数发送回第二个内容页面。

要打破它,只需尝试将 IsayHello 服务与 IPageDialogService 交换。我不确定发生了什么事情会破坏它。

提前致谢:)

【问题讨论】:

  • 好的。发现重命名的问题。我发现当视图不直接位于“视图”命名空间下(即 Views.Pages 或 Views.Dashboard)时,它们不会加载。将它们直接移动到“视图”下没有错误。此外,我必须删除 XAML 中的显式 AutowireViewModel = "True" 声明,因为它已经由 ViewModelLocator 处理。然后,ViewModelLocator 能够很好地定位和绑定我的视图。从构造函数调用注入服务的方法时仍然不确定 NullReference。

标签: c# xamarin.forms prism


【解决方案1】:

INavigationService 是一个命名类型,我记得 Unity 的一个已知限制是命名类型必须在未命名类型之前。

【讨论】:

  • 我尝试重新排列构造函数中的依赖关系,但没有帮助。在我发布的示例中,我感到困惑的是,当从构造函数调用时,我的 IsayHello 服务工作正常,INavigationService 也是如此,但 IPageDialogService 不能。
  • 您得到的错误似乎是由于您从 MainPage 执行此操作。如果您尝试从构造函数或 OnNavigatedTo 执行页面对话服务,Xamarin.Forms.Application.Current.MainPage 仍然为空。因此,Page Dialog Service 无法调用 Xamarin Forms Display Alert 方法。一旦页面显示并单击“Say Hi”按钮,它就可以执行,因为 MainPage 已实际设置。
  • 你是对的。当 PageDialogService 尝试使用 MainPage 时,它​​为空。谢谢你:)
【解决方案2】:

正如 Dan S. 在 cmets 中提到的那样。当我调用 PageDialogService 来显示警报时,MainPage 没有设置,因此是 NullReference。

如果您确实需要执行类似的操作,并且希望在执行操作之前以某种方式等待某事完成,请尝试Task.Yield()

我将我的方案固定如下,

    // will yield for current operation of page appearing
    await Task.Yield(); 

    // by now, the page has appeared and set, so this should work fine
    SayHiCommand.Execute(this); 

我过去曾使用过这种解决方法。如果您知道更好的处理方式,请发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多