【问题标题】:Prism ConfirmNavigationRequest() called twice when DataContext = thisPrism ConfirmNavigationRequest() 在 DataContext = this 时调用了两次
【发布时间】:2024-01-24 07:05:02
【问题描述】:

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

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

基本上是这样的:

  1. Prism 检查视图是否实现IConfirmNavigationRequest,如果实现则调用ConfirmNavigationRequest()
  2. 询问用户是否要继续。
  3. 用户点击OK,ConfirmNavigationRequest()返回true
  4. Prism 检查视图模型(在我的例子中,它又是视图)是否实现了IConfirmNavigationRequest,如果实现了就调用ConfirmNavigationRequest()
  5. 再次询问用户是否要继续。

如您所见,Prism 要求我的视图确认两次,因为它同时查询视图和视图模型。

所以我的问题是,我怎样才能防止这种情况发生,或者我怎样才能检测出哪个呼叫是哪个呼叫,以便我可以忽略其中一个呼叫?我考虑过调查continuationCallback 参数,但我不太喜欢这个解决方案,因为它不太可能会在下一个版本的 Prism 中中断。

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

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

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

    而不是

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

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

    【讨论】: