如何在程序启动时通过视图模型将视图注入区域

How to inject a view into a region via view model at program start

我正在创建一个 WPF MVVM Prism 应用程序,我需要在一个区域内的视图之间切换,这是我通过视图注入实现的。我像这样在 MainWindow.xaml 中实例化区域:

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

以后用命令改变视图是没有问题的。问题是我需要程序开始时的区域才能从头开始显示视图。当我把它放在构造函数中时,比如

public MainWindowViewModel(IContainerExtension container, IRegionManager regionManager)
{
   _regionManager = regionManager;
   _container = container;

   _view1 = _container.Resolve<1Control>();
   _view2 = _container.Resolve<2Control>();
   _contentregion = _regionManager.Regions["ContentRegion"];
   _contentregion.Add(_view1);
   _contentregion.Add(_view1);
}

我收到 RegionManager 不包含 ContentRegion 的错误。之所以会这样,是因为当时还没有从 XAML 实例化。我不能像 here 那样使用主 window 和 Loaded 事件,因为我需要在视图模型中而不是在代码隐藏中进行。以某种方式设置默认视图(可能在 XAML 中?)然后稍后使用命令更改活动视图也足够了,但我也不知道它是如何工作的。

如果您想要视图注入或使用导航框架并需要设置初始视图,您可以通过覆盖 [=22] 中的 OnInitialized 使用 Prism 应用程序中的区域管理器注入或导航到它=]App.xaml.cs。 首先调用 base.OnInitialized(); 很重要,因为它会在 shell window 上调用 Show()。因此,在这个调用之后 shell 视图被初始化并且区域管理器知道它的区域。

public partial class App : PrismApplication
{
   // ...bootstrapping code.

   protected override void OnInitialized()
   {
      base.OnInitialized();

      var regionManager = Container.Resolve<IRegionManager>();
      var contentRegion = regionManager.Regions["ContentRegion"];

      var view1 = Container.Resolve<Control1>();
      var view2 = Container.Resolve<Control2>();
      contentRegion.Add(view1);
      contentRegion.Add(view1);
   }
}

另一种方法是使用 view discovery 而不是 view injection,您可以使用RegisterViewWithRegion 方法。在 App.xaml.cs 中的 Prism 应用程序中,您可以在 CreateShellOnInitialized 等不同的地方执行此操作,因为此方法仅 用区域注册视图。当区域可用并显示视图时,它将在稍后实例化。 Prism 将自动创建视图并将其加载到区域中。

protected override void OnInitialized()
{
   var regionManager = Container.Resolve<IRegionManager>();
   regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control1));
   regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control2));
}