2

我正在开发一个具有以下结构的 WPF PRISM 应用程序(我已经简化以更好地解释而无需额外的层)。我使用 Unity 作为我的 DI/IOC

  • AppMain - 引导程序
  • Gui - 视图和视图模型
  • 数据 - 使用 EF 的数据。

在 Gui 中,我的视图名称如下:

  • 员工视图
  • 订单查看
  • 报告

我在外壳中有三个区域。MainRegion - 主要内容 TopRegion - 导航菜单 BottomRegion - 状态栏

我正在使用以下方法将视图注册到区域

IRegion region = _regionManger.Regions[RegionNames.MainRegion];
var mainView = _container.Resolve<Home>();
region.Add(mainView, ViewNames.HomeViewName);
region.Activate(mainView);

第一个激活发生在 Top、Main 和 Bottom 的 Module Initialize 方法中。

在此之后,我在单击按钮时激活其他视图。现在只是后面的代码。示例代码在这里:

 IRegion region = _regionManger.Regions[RegionNames.MainRegion];
 var reportView = region.GetView(ViewNames.ReportsViewName);
 if (reportView == null)
 {
    reportView = _container.Resolve<ReportsView>();
    region.Add(reportView, ViewNames.ReportsViewName);
    region.Activate(reportView);
 }
 else
 {
        region.RequestNavigate(ViewNames.ReportsViewName);
 }

问题1:任何关于如何做到这一点或我正在做的方式的建议都很好。顶部菜单有主页、员工、订单、报告按钮。

在主页中,我在 datagrid 中将员工最近的订单设置为只读。我想双击导航到 OrderView 并将所选订单传递给用户。问题2我不确定在哪里进行导航。

问题3:另一个问题是如果将 RegionMemberLifeTime keepAlive 设置为 false,INavigationAware 方法不会触发。如果我没有将 KeepAlive 设置为 false,则不会刷新页面,因为不会调用视图模型。

我需要在导航到页面时刷新页面并且不会过时,并且还需要在视图导航离开时向用户处理任何确认提示。

非常感激你的帮助。

4

1 回答 1

1

确实为时已晚,但是……</p>

问题 1/2:在模块初始化程序中向区域添加内容是否有特殊原因?常见的方式更像是 -> 在 xaml 中:

<ContentControl prism:RegionManager.RegionName="MainRegion" />

并在 ModuleInit.cs -> Initialize()

_regionManager.RegisterViewWithRegion("MainRegion", () => _container.Resolve<MainView>());

问题 3:视图必须实现 INavigationAware、IRegionMemberLifetime 和切换区域,在 viewModel 中您执行以下操作:

_regionManager.RequestNavigate("RegionWhatever", new Uri("TestView", UriKind.Relative));

但要工作,您必须在 ModulInit.cs 中将其注册为具有 viewName 的对象,如下所示:

_container.RegisterType<Object, TestView>("TestView");

当然还有一个在 xaml 中定义的具有正确 RegionName 的 contentControl

于 2013-07-05T12:31:04.467 回答