具有多个视图相同 ViewModel 的棱镜导航

Posted

技术标签:

【中文标题】具有多个视图相同 ViewModel 的棱镜导航【英文标题】:Prism Navigation with Multiple View same ViewModel 【发布时间】:2021-11-01 08:28:46 【问题描述】:

我的解决方案中有一个名为 GCode 的 Prism 模块项目。 在这个模块中,我有多个视图:GCodeViewMenuViewGCodeEditorViewGCodeProductionView

GCodeView 是这个模块的主视图,带有GCodeViewModel, 在GCodeModule.cs 我正在将它添加到另一个项目的区域中。

public class GCodeModule : IModule

    private readonly IRegionManager _regionManager;
    public GCodeModule(IRegionManager regionManager)
    
        _regionManager = regionManager;
    

    public void OnInitialized(IContainerProvider containerProvider)
    
        _regionManager.RegisterViewWithRegion(RegionNames.GCodeRegion, typeof(GCodeView));

        _regionManager.RequestNavigate(GCodeRegionNames.MenuRegion, nameof(MenuView));
        _regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeEditorView));
    

    public void RegisterTypes(IContainerRegistry containerRegistry)
    
        containerRegistry.RegisterForNavigation<MenuView, MenuViewModel>();
        containerRegistry.RegisterForNavigation<GCodeEditorView, GCodeEditorViewModel>();
        containerRegistry.RegisterForNavigation<GCodeProductionView, GCodeEditorViewModel>();
    

MenuView 添加到GCodeView 上的区域。如您所见,我对GCodeEditorViewGCodeProductionView 使用相同的GCodeEditorViewModel

我在MenuView 上有一个ToggleButton,它将GCodeEditorViewGCodeProductionView 切换到我的“ContentRegion”。

private void ExecuteModeSwitchCommand(bool? isChecked)
        
            if(isChecked == true)
            
                _regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeEditorView));
            
            else
            
                _regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeProductionView));
            
        

在应用程序启动时,GCodeEditorViewModel 触发构造函数 - 没关系 - 但在第一次 RequestNavigateGCodeProductionView 时,构造函数再次触发。之后来回切换不再触发构造函数。这就是目标,但我不确定为什么它会触发两次。

整个目标是 - 也许我正在从不同的方式接近 - 是让这个模块具有一个菜单视图和两个其他视图(生产/编辑器)“模式”来查看相同的“GCode”文件。

注意:GCodeProductionView 我正在使用ListBox 来显示“GCode”文本文件中的行。在GCodeEditorView 上使用TextBox 来显示“GCode”文本以便能够编辑。我知道我可以在ListBox 中进行编辑,但是如果用户在编辑ListBoxItem 期间在任意位置按回车键,我该如何添加新行?

【问题讨论】:

【参考方案1】:

GCodeModule.RegisterTypes 中,在进行其他注册之前将视图模型注册为单例。这应该使它只被构造一次。

换句话说,让这成为你的第一行

    containerRegistry.RegisterSingleton<GCodeEditorViewModel>();

【讨论】:

以上是关于具有多个视图相同 ViewModel 的棱镜导航的主要内容,如果未能解决你的问题,请参考以下文章

棱镜:贝壳之间的导航?

ViewModel 在导航导航中没有被清除,并且 viewmodel 中的实时数据保持活动状态

如何将视图与viewmodel关联或ViewModel的多个DataTemplates?

如何在MVVM中使用相同的ViewModel拥有多个视图?

WPF - 使用具有多个 ViewModel 的单个模型

MVVM + WPF - 为具有多个视图的 ViewModel 设计