WPF Prism 多区域确认导航请求

3
我有一个包含三个区域的应用程序。区域A是导航区,用于保存应用中模块的导航项。区域B和C是模块的内容区域。我还有两个模块Module1和Module2,每个模块都有一个导航项目控件加载到区域A。 区域A包含NavigationItemMod1Control和NavigationItemMod2Control。
NavigationItemMod1Control绑定了一个命令,该命令将view1B加载到区域B,并将view1C加载到区域C(NavigationItemMod2Control具有类似的命令)。下面是命令执行方法:
public void Execute(object parameter)
 {
        // Show View 1B
        var view1BUri = new  Uri(Module1RegionNames.ViewBControl, UriKind.Relative);
        regionManager.RequestNavigate(RegionNames.ViewBArea, view1BUri );

        // Show View 1C
        var view1CUri = new Uri(Module1RegionNames.ViewCControl, UriKind.Relative);
        regionManager.RequestNavigate(RegionNames.ViewCArea, view1CUri );
}

当我点击NavigationItemMod2Control时,我希望在将视图2B或视图2C加载到各自的区域之前确认导航。

我已经成功地在Module 1中的View1B的viewmodel上实现了IConfirmNavigationRequest,但这仅控制区域B的导航。如果用户取消导航请求,则区域B将正确保留为View1B,但View2C将加载到区域C。

有没有建议如何为两个区域同时确认导航?


为什么您不能为view1C的视图模型实现IConfirmNavigationRequest - dymanoid
@dymanoid,我曾考虑过这一点,但我想在Module 1中统一管理所有视图的导航确认。 - Tiggy
1个回答

1
请求导航具有支持回调的重载:
var navigationParameters = new NavigationParameters();
                    navigationParameters.Add("RelatieId", _CurrentRelatie.RelatieId);
regionManager.RequestNavigate("RelatieDetailRegion",
                        new Uri("RelatieDetail", UriKind.Relative), NavigationCallback, navigationParameters);

void NavigationCallback(NavigationResult nr)
    {
        _logger.Log("NavigationCallback", Category.Info, Priority.Medium);
        if (nr.Result.Value == true)
        {

             //navigate region C, so this is your code
             var view1CUri = new Uri(Module1RegionNames.ViewCControl, UriKind.Relative);
             regionManager.RequestNavigate(RegionNames.ViewCArea, view1CUri );
        }
    }

这是基于我的一段代码片段,您需要进行一些微调,例如不使用您未使用的navigationparameters。


谢谢,这解决了我目前的问题。有没有一种方法来强制执行这个模式?其他开发人员很快就会添加更多的模块,并且需要类似的逻辑。我考虑过创建一个基础命令类,该类接受任何模块中ViewB和ViewC的Uri,然后按照您建议的方式处理导航。这将起作用,但它依赖于每个人都使用此基类来编写其命令,而这目前是可选的。 - Tiggy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接