Select 当 Main Window 在 Prism 中打开时显示哪个视图

Select which view to display when Main Window open in Prism

这确实应该很容易,但我无法建立。
我有一个带有 Prism 6
的小型 WPF 应用程序 我有 Main Window 和里面的两个视图。

MainWindowMainWindowViewModel 视图模型 class
ConfigurationViewConfigurationViewModel 视图模型 class
SignInViewSignInViewModel 视图模型 class

现在当第一次显示主要 window 时,我想 select 根据一些布尔条件显示哪个视图

这是 bootstrap class.

的片段
protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

    ViewModelLocationProvider.Register<MainWindow, MainWindowViewModel>();
    ViewModelLocationProvider.Register<SignInView, SignInViewModel>();
    ViewModelLocationProvider.Register<ConfigurationView, ConfigurationViewModel>();

    Container.RegisterInstance(new SignInView());
    Container.RegisterInstance(new ConfigurationView());
}

protected override DependencyObject CreateShell()
{
    return Container.Resolve<MainWindow>();
}

protected override void InitializeShell()
{
    Application.Current.MainWindow.Show();

    IRegionManager _regionManager = Container.Resolve<IRegionManager>();
    IRegion _region = _regionManager.Regions[RegionNames.MainRegion];

    _region.Add(Container.Resolve<SignInView>());
    _region.Add(Container.Resolve<ConfigurationView>());
}

现在总是在打开应用程序的主 window 时显示 SignInView
我如何 select 根据需要从 MainWindowViewModel class 带来的某些条件 显示哪个视图?

更新

public class MainWindowViewModel
{
    private IAccountService _accountService;

    public MainWindowViewModel(IUnityContainer container)
    {
        IRegionManager regionManager = Container.Resolve<IRegionManager>();
        _accountService = container.Resolve<IAccountService>();

        if (_accountService.IsSignedIn)
            regionManager.RequestNavigate(RegionNames.MainRegion, new Uri(nameof(ConfigurationView), UriKind.Relative));
        else
            regionManager.RequestNavigate(RegionNames.MainRegion, new Uri(nameof(SignInView), UriKind.Relative));
    }       
}

主要Window视图

<Window x:Class="Shell.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True">

此代码无效。

需要先创建区域,然后才能向其添加视图。所以你最好自己创建 MainViewModel 创建 MainWindow 之后:

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

    ViewModelLocationProvider.Register<SignInView, SignInViewModel>();
    ViewModelLocationProvider.Register<ConfigurationView, ConfigurationViewModel>();

    Container.RegisterInstance(new SignInView());
    Container.RegisterInstance(new ConfigurationView());
}

protected override DependencyObject CreateShell()
{
    return Container.Resolve<MainWindow>();
}

protected override void InitializeShell()
{
    IRegionManager _regionManager = Container.Resolve<IRegionManager>();
    IRegion _region = _regionManager.Regions[RegionNames.MainRegion];

    _region.Add(Container.Resolve<SignInView>());
    _region.Add(Container.Resolve<ConfigurationView>());


    var mainWindowViewModel = Container.Resolve<MainWindowViewModel>();
    Application.Current.MainWindow.DataContext = mainWindowViewModel;
    Application.Current.MainWindow.Show();
}

MainWindow 中删除:

prism:ViewModelLocator.AutoWireViewModel="True">

首先,注册用于导航的视图类型,而不是视图实例。

其次:条件 - 或更一般:数据 - 很少源自视图模型(除非是用户输入),因此您应该有一些 IUserManagement 服务来拉取当前用户。

但话虽这么说,如果您注册了视图,您应该能够导航到它。没有具体的异常,很难猜出问题出在哪里。

Container.RegisterTypeForNavigation<SignInView>();

...

_regionManager.RequestNavigate( RegionNames.MainRegion, typeof(SignInView).Name );