棱镜导航与多个视图相同的 ViewModel
Prism Navigation with Multiple View same ViewModel
我的解决方案中有一个名为 GCode 的 Prism 模块项目。
在这个模块中,我有多个视图:GCodeView
、MenuView
、GCodeEditorView
、GCodeProductionView
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
上的区域。如您所见,我对 GCodeEditorView
和 GCodeProductionView
使用相同的 GCodeEditorViewModel
。
我在 MenuView
上有一个 ToggleButton
将 GCodeEditorView
和 GCodeProductionView
切换到我的“ContentRegion”。
private void ExecuteModeSwitchCommand(bool? isChecked)
{
if(isChecked == true)
{
_regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeEditorView));
}
else
{
_regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeProductionView));
}
}
在应用程序启动时,GCodeEditorViewModel
会触发构造函数 - 没关系 - 但第一次从 RequestNavigate
到 GCodeProductionView
时,构造函数会再次触发。之后来回切换不再触发构造函数。这就是目标,但我不确定为什么会触发它两次。
整个目标是——也许我是从不同的方式来实现的——是让这个模块有一个菜单视图和两个其他视图(production/editor)“模式”以看到相同的“GCode”文件。
注意:GCodeProductionView
我正在使用 ListBox
来显示“GCode”文本文件中的行。在 GCodeEditorView
上使用 TextBox
来显示能够编辑的“GCode”文本。我知道我可以在 ListBox
中编辑,但是如果用户在编辑 ListBoxItem
时在任何地方按回车键,我该如何添加一个新行?
在 GCodeModule.RegisterTypes
中,在进行其他注册之前将视图模型注册为单例。这应该使其只构造一次。
换句话说,让它成为你的第一行
containerRegistry.RegisterSingleton<GCodeEditorViewModel>();
我的解决方案中有一个名为 GCode 的 Prism 模块项目。
在这个模块中,我有多个视图:GCodeView
、MenuView
、GCodeEditorView
、GCodeProductionView
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
上的区域。如您所见,我对 GCodeEditorView
和 GCodeProductionView
使用相同的 GCodeEditorViewModel
。
我在 MenuView
上有一个 ToggleButton
将 GCodeEditorView
和 GCodeProductionView
切换到我的“ContentRegion”。
private void ExecuteModeSwitchCommand(bool? isChecked)
{
if(isChecked == true)
{
_regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeEditorView));
}
else
{
_regionManager.RequestNavigate(GCodeRegionNames.ContentRegion, nameof(GCodeProductionView));
}
}
在应用程序启动时,GCodeEditorViewModel
会触发构造函数 - 没关系 - 但第一次从 RequestNavigate
到 GCodeProductionView
时,构造函数会再次触发。之后来回切换不再触发构造函数。这就是目标,但我不确定为什么会触发它两次。
整个目标是——也许我是从不同的方式来实现的——是让这个模块有一个菜单视图和两个其他视图(production/editor)“模式”以看到相同的“GCode”文件。
注意:GCodeProductionView
我正在使用 ListBox
来显示“GCode”文本文件中的行。在 GCodeEditorView
上使用 TextBox
来显示能够编辑的“GCode”文本。我知道我可以在 ListBox
中编辑,但是如果用户在编辑 ListBoxItem
时在任何地方按回车键,我该如何添加一个新行?
在 GCodeModule.RegisterTypes
中,在进行其他注册之前将视图模型注册为单例。这应该使其只构造一次。
换句话说,让它成为你的第一行
containerRegistry.RegisterSingleton<GCodeEditorViewModel>();