c# - Prism 区域在内容区域中没有变化 - WPF

标签 c# wpf mvvm prism contentcontrol

我正在尝试学习 Prism 并在我正在开发的新应用程序中使用,但我一直在试图让它在导航中切换内容。作为引用,我正在工作/学习的视频是 Brian Lagunas 在 YouTube 上的视频 MVVM Made Simple(我已经多次浏览该部分,但无法弄清楚我做错了什么)。这是我的主窗口背后的代码(当我添加 regionManager.RegisterViewWithRegion() 行时,它允许注册的第一个 View 在启动时显示,但仍然不允许我从一个 View 切换到另一个 View 。

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

这是我与区域/区域管理器相关的所有代码和 prism xmlns 语句(这些位于我所有 View 的顶部) - 我已经测试了按钮上的命令绑定(bind)并知道该方法正在触发,所以按钮应该是好的 - 但我不确定的其他一切,但根据视频,它看起来对我来说是正确的。

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>

Bootstrap
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 类(class),那里的说明看起来也一样,所以据我所知,这一定是我缺少的东西。

最佳答案

protected RegionManager regionManager = new RegionManager();


您也不想创建自己的RegionManager您也不想在 View 中执行此操作。

在 View 模型中执行导航并注入(inject)区域管理器。

public MainWindowViewModel(Window _window, RegionManager _regionManager)


您不想在 View 模型中拥有 View ,而且您也不需要它。

让 View 仅通过绑定(bind)与 View 模型交互。

I have two views (viewA and viewB) and two buttons that should switch between the two views



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

您不想使用 RegisterViewWithRegion在这里,只需导航到 ViewA当您的应用程序完成初始化时。

关于c# - Prism 区域在内容区域中没有变化 - WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52695921/

相关文章:

c# - 是否有一种方法或库会为字符串比较产生冗长且有用的失败断言结果?

c# - 从 IEnumerable 初始化字典的最有效方法是什么?

mvvm - 如何在ReactiveUI for iOS中绑定(bind)按钮点击命令

c# - 如何更新 TabControl 资源?

c# - C# 或一般 .Net 中的 C 解析器

c# - 添加 .resx 文件时 WPF .net Core 3.0 编译错误

c# - WPF 程序在一台计算机上启动速度超快,但在另一台计算机上启动速度超慢

C# 库尔德语言本地化

wpf - Xceed DataGrid 重置滚动条位置

c# - 自动选择添加到 ObservableCollection 的项目