在我的Shell窗口中,我有一个工作空间区域,允许通过RequestNavigate进行视图切换。我正在使用带有View-First方法的Unity,以便视图初始化看起来像:
public partial class WelcomeView : UserControl
{
public WelcomeView(WelcomeViewModel vm)
{
InitializeComponent();
this.DataContext = vm;
}
}
当应用程序加载时,我想导航到默认视图,以便我的BootStrappers InitializeShell看起来如下:
protected override void InitializeShell()
{
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
}
现在,我的默认视图WelcomeView需要在构造函数中注入WelcomeViewModel,而反过来,WelcomeViewModel需要在其构造函数中注入一些服务:
public class WelcomeViewModel : INotifyPropertyChanged
{
public WelcomeViewModel(ISomeService someService)
{
// Use some service
someService.SomeEventOccured += new Action(someService_SomeEventOccured);
}
...
}
问题是当ISomeService由模块提供时,因为在调用InitializeShell时没有初始化模块,所以无法构造WelcomeViewModel,反过来也不能使用WelcomeView。
这样做的正确方法是什么?
答案 0 :(得分:2)
执行此操作的正确方法是使用模块依赖性
所以具有依赖关系的模块将包含
[ModuleDependency("SomeModule")]
[ModuleDependency("SomeOtherModule")]
public class MyModule : IModule { }
它所依赖的模块将包含:
[Module(ModuleName = "SomeModule")]
public class MyOtherModule: IModule
不使用“魔术字符串”也是有意义的,就像我在这里一样,在您的公共/基础设施项目中有一个包含所有模块名称的静态类。
这将允许prism以正确的顺序加载模块,以便您的依赖项始终解析。
答案 1 :(得分:1)
只需将您请求导航的部分移动到稍后的位置即可。调用引导程序的特定顺序并对其进行汇总。
调用InitializeModules方法。
protected override void InitializeModules()
{
base.InitializeModules();
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
}
创建模块依赖项将不起作用,因为当您尝试导航到依赖于它们的视图时,甚至不会加载模块。另外我想指出你为什么使用服务定位器?当您在引导程序中工作时,可以直接访问容器。可以找到完整加载顺序here