0

在我的 Shell 窗口中,我有一个工作区区域允许通过 RequestNavigate 进行视图切换。我将 Unity 与 View-First 方法一起使用,以便视图初始化如下所示:

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。

这样做的正确方法是什么?

4

2 回答 2

2

正确的方法是使用模块依赖

所以具有依赖关系的模块将包含

[ModuleDependency("SomeModule")] 
[ModuleDependency("SomeOtherModule")] 
public class MyModule : IModule { } 

它所依赖的模块将包含:

[Module(ModuleName = "SomeModule")] 
public class MyOtherModule: IModule 

不使用“魔术字符串”也是有意义的,就像我在这里使用的那样,而是在您的公共/基础设施项目中有一个包含所有模块名称的静态类。

这将允许 prism 以正确的顺序加载模块,以便您的依赖关系始终得到解决。

于 2012-06-26T14:22:05.050 回答
1

只需将您请求导航的部分移动到稍后的时刻。调用引导程序并对其进行总结有一个特定的顺序。

  1. 调用 CreateShell 方法
  2. 调用 InitializeShell 方法
  3. InitializeModules 方法被调用。

    protected override void InitializeModules()
    {
        base.InitializeModules();
    
        var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
        regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
    }
    

创建模块依赖项将不起作用,因为当您尝试导航到依赖于它们的视图时甚至没有加载模块。另外我想指出您为什么使用服务定位器?当您因为在引导程序中工作而可以直接访问容器时。完整的加载顺序可以在这里找到

于 2012-06-26T20:07:09.713 回答