在视图模型类中访问unity容器

时间:2010-09-23 17:58:01

标签: wpf mvvm unity-container prism

我有一个看起来像工具栏的shell,并定义了我的主要区域(一个包裹面板)。我需要做的是能够向shell添加小部件,当单击小部件时,会打开一个新窗口(视图)。以下是我到目前为止:

我创建了一个模块类,它将视图添加到主区域:

public class MyModule : IModule
{
  protected IUnityContainer Container { get; private set; }

  public MyModule(IUnityContainer container)
  {
    Container = container.CreateChildContainer();
  }

  public void Initialize()
  {
    var regionManager = Container.Resolve<IRegionManager>();
    MyModuleView myModuleView = new MyModuleView();
    regionManager.Regions["MainRegion"].Add(myModuleView);
  }
}

以下是MyModuleView的内容:

  <Grid>
    <Grid.DataContext>
      <vm:MyModuleVM/>
    </Grid.DataContext>
    <Button Content="My Module" Foreground="White" FontWeight="Bold" Command="{Binding Path=LaunchCommand}">
    </Button>
  </Grid>

视图模型,MyModuleVM:

  class MyModuleVM : ObservableObject
  {
    protected IUnityContainer Container { get; private set; }

    public MyModuleVM()
    {
    }

    RelayCommand _launchCommand;
    public ICommand LaunchCommand
    {
      get
      {
        if (_launchCommand == null)
        {
          _launchCommand = new RelayCommand(() => this.LaunchTestView(),
              () => this.CanLaunchTestView());
        }
        return _launchCommand;
      }
    }

    private void LaunchTestView()
    {
      TestView view = new TestView();
      view.Title = "Test View";
      var regionManager = Container.Resolve<IRegionManager>();
      regionManager.Regions["MyWindowRegion"].Add(view);
    }

    private bool CanLaunchTestView()
    {
        return true;
    }
  }

所以我的计划如下:

  • 创建实现的类 IModule(MyModule)并加载一个 查看(MyModuleView)进入shell 初始化时

  • 为模块创建视图模型 (MyModuleVM)并将其设置为 显示的视图的DataContext shell

  • MyModuleVM包含一个命令a MyModuleView中的按钮绑定到。 单击按钮时 命令被触发

  • 现在,这就是我被困的地方。运用 一个WindowRegionAdapter(一个适配器 这有助于创建视图 单独的窗口)我想创建 并显示一个新视图。如图所示 MyModuleVM,LaunchTestView需要 访问容器以便 将视图添加到区域。我怎么样 应该去集装箱吗?

除了我关于访问容器的具体问题之外,我的整体策略是如何将“小部件”添加到工具栏shell并启动 单击它们时的视图?当涉及带有Prism的MVVM时,我是否在这里完全偏离轨道?

谢谢你们。

1 个答案:

答案 0 :(得分:1)

您可以通过constructorproperty injection注册容器。为此,ViewModel实例必须是容器resolved,或者BuildUp方法在实例化后应该调用。

我希望这会有所帮助。

谢谢, 达米安