选择在Prism

时间:2017-06-15 13:07:09

标签: c# wpf prism

这真的很容易,但我无法建立它。
我有Prism 6的小型WPF应用程序 我有主窗口,里面有两个视图。

带有MainWindow视图模型类的

MainWindowViewModel ConfigurationView ConfigurationViewModel查看模型类
SignInView SignInViewModel查看模型类

现在第一次显示主窗口时,我想根据某些布尔条件选择要显示的视图

这是bootstrap类的片段。

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>());
}

现在,当应用程序的主窗口打开时,是否会显示SignInView
如何根据需要从MainWindowViewModel类带来的某些条件选择要显示的视图?

更新

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 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">

此代码无效。

2 个答案:

答案 0 :(得分:1)

需要先创建区域,然后才能向其添加视图。因此,在创建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">

答案 1 :(得分:1)

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

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

但话虽如此,如果您注册了您的视图,您应该能够导航到它。没有具体例外,很难猜出出了什么问题。

Container.RegisterTypeForNavigation<SignInView>();

...

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