带有Navigate的MVVM Prism EventToCommandBehavior引发ArgumentNullException(TargetName)

时间:2019-12-29 09:40:23

标签: xaml mvvm navigation prism

在Xamarin Forms项目中,当用户选择一个项目时,我试图从一个包含项目列表的页面导航到另一个页面。 我希望在xaml中声明的导航和作为参数传递的事件args的 ItemSelected 。 当我点击该项目时,会引发 ArgumentNullException

值不能为null。 参数名称:TargetElement

这是代码

<ListView.Behaviors>
    <b:EventToCommandBehavior 
        EventName="ItemSelected"
        Command="{prism:NavigateTo 'ContractVersionV'}"
        EventArgsParameterPath="SelectedItem"
        />
</ListView.Behaviors>

如果我不使用 NavigateTo 扩展名,并使用viewModel中的命令管理导航,则一切正常。

可能我想做什么?

更新

堆栈跟踪为:

在Prism.Xaml.ParentPageAwareExtension`1.Initialize()中    在Prism.Navigation.Xaml.NavigationExtensionBase.d__16.MoveNext()中    在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中    在System.Runtime.CompilerServices.AsyncMethodBuilderCore中。<> c.b__7_0(对象状态)    在System.Threading.WinRTSynchronizationContextBase.Invoker.InvokeCore()

Here一个简单的项目,再现了问题。

开始并单击一个项目。

1 个答案:

答案 0 :(得分:0)

那是因为IProvideValueTarget.TargetObject为null,这可能是因为行为(比如说)在视觉树之外。 但是我认为这是一个错误。也许Brian Lagunas对此案有解决方案。

我想出了一个在ListView上附加的命令,该命令在ItemTapped上执行。

所以,相反:

<ListView.Behaviors>
    <b:EventToCommandBehavior 
        EventName="ItemTapped"
        Command="{prism:NavigateTo 'MyPage'}"
        EventArgsParameterPath="Item" />
</ListView.Behaviors>

您可以:

<ListView ListViewExtensions.ItemTappedCommand="{prism:NavigateTo 'MyPage'}" />

我以这种方式使它工作,但是我对此不太满意。 而且,使用带命令的Button的ItemTemplate看起来很简单,但不是正确的选择,尤其是当您已经有一个更复杂的项目模板时。