在我的 Shell 窗口中,我有一个工作区区域,允许通过 RequestNavize 切换视图。我正在使用带有视图优先方法的 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。
正确的方法是什么?
正确的方法是使用模块依赖项
因此,具有依赖项的模块将包含
[ModuleDependency("SomeModule")]
[ModuleDependency("SomeOtherModule")]
public class MyModule : IModule { }
它所依赖的模块将包含:
[Module(ModuleName = "SomeModule")]
public class MyOtherModule: IModule
不使用"魔术字符串"也是有意义的,就像我在这里所做的那样,而是在您的公共/基础结构项目中有一个静态类,其中包含所有模块的名称。
这将允许 prism 以正确的顺序加载模块,以便您的依赖项始终解析。
只需将您请求导航的部分移动到稍后即可。调用引导程序有一个特定的顺序并对其进行总结。
- 创建外壳方法称为
- 初始化外壳方法称为
-
调用 InitializeModules 方法。
protected override void InitializeModules() { base.InitializeModules(); var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>(); regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView"); }
创建模块依赖项将不起作用,因为当您尝试导航到依赖于它们的视图时,甚至不会加载模块。我还想指出您为什么使用服务定位器?当您可以直接访问容器时,因为您在引导程序中工作。满载订单可以在这里找到