Доступ к контейнеру единиц в классе модели представления - PullRequest
3 голосов
/ 23 сентября 2010

У меня есть оболочка, которая выглядит как панель инструментов и определяет мою основную область (панель переноса).Что мне нужно сделать, так это уметь добавлять виджеты в оболочку, и при нажатии на виджет открывается новое окно (представление).Ниже приведено то, что у меня есть:

Я создал класс модуля, который добавляет представление в основной регион:

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 необходим доступ к контейнеру, чтобы добавить представление в регион.Как мне добраться до контейнера?

Помимо моего конкретного вопроса о доступе к контейнеру, какова моя общая стратегия добавления «виджетов» в оболочку панели инструментов и запуска представлений, когда онинажали?Я совершенно не в курсе, когда дело доходит до MVVM с Prism?

Спасибо, ребята.

1 Ответ

1 голос
/ 23 сентября 2010

Вы можете получить контейнер, внедренный через конструктор или свойство инъекции . Для этого экземпляр ViewModel должен разрешаться контейнером, или же после его создания должен вызываться метод BuildUp .

Надеюсь, это поможет.

Спасибо, Damian

...