Xamarin.Forms 的 Prism 无法自动装配
Prism for Xamarin.Forms unable to AutoWire
我正在为我的下一个客户项目尝试 Prism.Forms。不幸的是,我发现我的样本出现了奇怪的行为。
借口
似乎 XF 或 Prism 不喜欢我包括一个现有的 XAML 页面(也被 Brian Lagunas 提到 - 这个人 - 他自己在 Evolve session)。但是重命名页面也会将其抛出并且 ViewModelLocator 似乎无法再定位 ViewModel。即使我 re-create 具有相同名称的页面,它也找不到它的 ViewModel。手动设置 BindingContext 有效,但我试图不为构造函数注入创建依赖项。
问题
在处理现有代码时,将 NavigationPage 用作根时,一个小的更改会导致 NullReference 异常。这是一个工作示例应用程序的示例
https://github.com/hnabbasi/xamarin/tree/master/XFPrism/XFPrism
我正在使用 NavigationPage 并推送 ContentPage。然后我推送另一个 ContentPage,然后我通过单击按钮显示模态页面并进行通信。我通过 NavigationParameters 将参数发送回第二个内容页面。
要打破它,只需尝试用 IPageDialogService 交换 ISayHello 服务。我不确定发生了什么破坏它。
提前致谢:)
INavigationService 是命名类型,我记得 Unity 的一个已知限制是命名类型必须在未命名类型之前。
正如 Dan S. 在评论中提到的那样。当我调用 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);
我过去曾使用过此解决方法。如果你知道更好的处理方式,请留言。
我正在为我的下一个客户项目尝试 Prism.Forms。不幸的是,我发现我的样本出现了奇怪的行为。
借口 似乎 XF 或 Prism 不喜欢我包括一个现有的 XAML 页面(也被 Brian Lagunas 提到 - 这个人 - 他自己在 Evolve session)。但是重命名页面也会将其抛出并且 ViewModelLocator 似乎无法再定位 ViewModel。即使我 re-create 具有相同名称的页面,它也找不到它的 ViewModel。手动设置 BindingContext 有效,但我试图不为构造函数注入创建依赖项。
问题 在处理现有代码时,将 NavigationPage 用作根时,一个小的更改会导致 NullReference 异常。这是一个工作示例应用程序的示例
https://github.com/hnabbasi/xamarin/tree/master/XFPrism/XFPrism
我正在使用 NavigationPage 并推送 ContentPage。然后我推送另一个 ContentPage,然后我通过单击按钮显示模态页面并进行通信。我通过 NavigationParameters 将参数发送回第二个内容页面。
要打破它,只需尝试用 IPageDialogService 交换 ISayHello 服务。我不确定发生了什么破坏它。
提前致谢:)
INavigationService 是命名类型,我记得 Unity 的一个已知限制是命名类型必须在未命名类型之前。
正如 Dan S. 在评论中提到的那样。当我调用 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);
我过去曾使用过此解决方法。如果你知道更好的处理方式,请留言。