【问题标题】:Accessing unity container in view model class在视图模型类中访问统一容器
【发布时间】:2010-09-23 17:58:00
【问题描述】:

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

我创建了一个向主区域添加视图的模块类:

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)进入外壳 初始化时

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

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

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

除了关于访问容器的具体问题之外,我将“小部件”添加到工具栏外壳并启动的总体策略如何 点击时的浏览量?当谈到 Prism 的 MVVM 时,我是否完全偏离了轨道?

谢谢大家。

【问题讨论】:

    标签: wpf mvvm unity-container prism


    【解决方案1】:

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

    我希望这会有所帮助。

    谢谢, 达米安

    【讨论】:

    • 嘿达米安。我的视图模型(需要访问容器)是通过视图的 xaml 创建的。我什至会在哪里编写代码来调用 container.Resolve 或 container.BuildUp?
    • 在这种情况下,您可以在 new MyModuleView() 之后立即执行(即:container.BuildUp(typeof(MyModuleVM), myModuleView.DataContext);),但在这种情况下,解决通过 ServiceLocator 的 RegionManager 也可能是一个不错的方法。
    • 嗯。如果我在 MyModuleView myModuleView = new MyModuleView() 之后立即添加 BuildUp,则似乎尚未创建 myModuleView.DataContext。也许我正在处理这个错误。这似乎是一项简单的任务,但我正在做的比它需要的更难。我用启动其他视图的小部件视图实现工具栏的方法是否合理?你知道任何讨论 ServiceLocator 的好资源吗?
    • 一些资源:commonservicelocator.codeplex.com,Prism 文档和代码,在 codeplex 的 Prism 论坛问题。 “模块化工具栏”的常用方法类似于您所遵循的方法:1)加载模块。 2) 解析 V-VM 对。 3) 将 V 添加到工具栏区域。您似乎对 2) 有疑问,因此我建议您查看 Prism 文档和代码以及 Unity 文档,以了解 V-VM 可以连接在一起的不同方式。
    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多