我正在玩MVVM(利用Prism和Unity),但我有点卡住了我将如何去获得给定模块的名称。在设计时,我不知道给定用户将访问哪些模块,因此显示需要是动态的。因此,如果我有3个模块,但用户只能访问模块1和模块3,我的容器的结构将类似于以下:
##########容器################================模块1文本=======
------------- 观点1的文本 ------------------
------------- 观点2文本 ------------------
------------- 观点3文本 ------------------
================模块3文本=======
------------- 观点1的文本 ------------------
------------- 观点2文本 ------------------
我知道(基本上)如何通过使用ViewModel来显示"视图X文本",但我不确定如何正确设置给定模块的文本。
作为参考,我的Bootstrapper.cs文件看起来像这样:
protected override DependencyObject CreateShell()
{
// Use the container to create an instance of the shell.
var view = Container.TryResolve<AppShell>();
return view;
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
protected override IModuleCatalog CreateModuleCatalog()
{
var catalog = new ModuleCatalog();
catalog.AddModule(typeof(Module1));
//catalog.AddModule(typeof(Module2));
catalog.AddModule(typeof(Module3));
return catalog;
}
如果您能提供任何帮助,我将不胜感激!
谢谢。
一个可能的简单解决方案是我上面评论的那个,我将在下面展开:
每个模块将定义和配置它们对应的视图,因此视图将在CompileTime时知道它们属于哪个模块。因此,为了生成和显示问题中描述的结构,可以在每个模块上创建一个 "ModuleXView"
View页面,为"X"对应的模块编号。
这个视图将包含例如TextArea
在顶部显示ModuleName,和 "ModuleXRegion"
定义(ItemsControl),以便注册并显示相应的模块视图在其中列出。每个ModuleXView
都知道它属于哪个模块。因此,不需要绑定ModuleName, TextArea
将静态配置每个ModuleName。
如果我不够清楚,基于Outlook的例子,Module1
将有一个 "Module1View"
,其TextArea
值将被设置为"Mail"; Module2View
将其TextArea
值设置为"Calendar",依此类推。
最后,如果你想有每个模块在不同的选项卡中,例如,你只需要注册每个 ModuleXView
在TabControl
区域(在父视图中定义),所以每个Tab
将显示 ModuleXView
页面结构。
我希望这对你有帮助,Regards