当DataContext=this时,Prism ConfirmNavigationRequest()调用了两次

本文关键字:调用 两次 ConfirmNavigationRequest DataContext this Prism | 更新日期: 2023-09-27 18:26:39

我正在使用Prism,我的视图实现IConfirmNavigationRequest,以便使它们能够执行验证并在需要时取消导航。

我的问题是,我有几个视图不使用MVVM,而是定义了DataContext = this。这样做会导致Prism调用我的视图的ConfirmNavigationRequest()两次,这意味着我请求用户的响应两次。

基本上是这样的:

  1. Prism检查视图是否实现了IConfirmNavigationRequest,如果实现了,则对其调用ConfirmNavigationRequest()
  2. 询问用户是否要继续
  3. 用户单击"确定",ConfirmNavigationRequest()返回true
  4. Prism检查视图模型(在我的情况下,它又是视图)是否实现了IConfirmNavigationRequest,如果实现了,则对其调用ConfirmNavigationRequest()
  5. 再次询问用户是否要继续

正如您所看到的,Prism两次请求我的视图进行确认,因为它同时查询视图和视图模型。

所以我的问题是,我如何防止这种情况发生,或者我如何检测哪个呼叫是哪个呼叫,这样我就可以忽略其中一个呼叫?我曾想过研究continuationCallback参数,但我不太喜欢这个解决方案,因为它在Prism的下一个版本中不太可能崩溃。

当DataContext=this时,Prism ConfirmNavigationRequest()调用了两次

到目前为止,我得到的最好的解决方案是我在Prism论坛上从DCherubini那里得到的解决方案,这表明我不会在我的UserControl上设置视图的DataContext,而是使用一个内部元素来保存视图,并为其设置DataContext

<UserControl>
    <Grid x:Name="grid">
        ...
    </Grid>
</UserControl>
grid.DataContext = this;

而不是

<UserControl x:Name="uc">
</UserControl>
uc.DataContext = this;

这应该有效,但这意味着我需要单独更改每个视图。一个不需要更改视图的解决方案会更好。