棱镜区域在内容区域中未更改-WPF

时间:2018-10-08 05:34:09

标签: c# wpf mvvm prism contentcontrol

我试图学习Prism并在我正在开发的新应用程序中利用它,但一直坚持尝试使其在导航中切换内容。作为参考,我正在工作/学习的视频是Brian Lagunas的视频MVVM在YouTube上制作的(我已经多次阅读了本节,但无法弄清楚我做错了什么)。这是主窗口后面的代码(当我添加regionManager.RegisterViewWithRegion()行时,它允许注册的第一个视图在启动时显示,但仍然不允许我从一个视图切换到另一个视图。

public partial class MainWindow : Window
{
    protected RegionManager regionManager = new RegionManager();

    public MainWindow()
    { 
        InitializeComponent();

        regionManager.RegisterViewWithRegion("Content", typeof(Index));
        regionManager.RegisterViewWithRegion("Content", typeof(Home));

        DataContext = new MainWindowViewModel(this, regionManager);

这是我与区域/区域管理器相关的所有代码和棱镜xmlns语句(这些位于我所有视图的顶部)-我已经测试了按钮上的Command绑定,并且知道方法已被触发,因此按钮应该很好-但是我不确定其他所有内容,但根据视频来看,这对我来说是正确的。

XMLNS语句

xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"

XAML中的内容区域

<!-- Page Content -->
<Border Grid.Row="3" Padding="{Binding WindowContentPadding}">
    <ContentControl prism:RegionManager.RegionName="Content" />
</Border>

引导程序

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

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

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

        // Registering Unity containers for view model navigation
        // All views must be registered.
        Container.RegisterType(typeof(object), typeof(Home), "Home");
        Container.RegisterType(typeof(object), typeof(Index), "Index");

    }
}

MainWindowViewModel

public DelegateCommand<string> NavigateCommand { get; set; }

public MainWindowViewModel(Window _window, RegionManager _regionManager)
{
    window = _window;

    // MVVM model locator code
    regionManager = _regionManager;

    NavigateCommand = new DelegateCommand<string>(Navigate);
}

private void Navigate(string uri)
{
    //Test
    Console.WriteLine(uri);
    regionManager.RequestNavigate("Content", uri);
}

我还检查了他的MVVM Pluralsight课程,那里的说明也一样,所以据我所知,这肯定是我所缺少的。

1 个答案:

答案 0 :(得分:0)

protected RegionManager regionManager = new RegionManager();

您既不想创建自己的RegionManager,也不想在视图中创建它。

在视图模型中执行导航,并注入区域管理器。

public MainWindowViewModel(Window _window, RegionManager _regionManager)

您不想将视图包含在视图模型中,并且也不需要它。

仅通过绑定使视图与视图模型交互。

  

我有两个视图(viewA和viewB)和两个按钮,应在两个视图之间切换

然后使一个按钮执行_regionManager.RequestNavigate( "Content", "viewA" ),另一按钮执行_regionManager.RequestNavigate( "Content", "viewB" )。视图应该像_container.RegisterTypeForNavigation<viewA>( "viewA" )这样注册。

您不想在此处使用RegisterViewWithRegion,只需在应用初始化完成后导航到ViewA