Окно MVVM / обработка региона - PullRequest
       4

Окно MVVM / обработка региона

2 голосов
/ 27 сентября 2010

Два вопроса здесь.

В моем представлении есть кнопка «Закрыть», при нажатии которой окно должно закрываться. Я обработал это следующим образом: кнопка в моем представлении привязывается к команде, определенной в модели представления представления, которая при запуске запускает следующее:

    private void Exit()
    {
      var regionManager = Container.Resolve<IRegionManager>();
      MyView existingView = regionManager.Regions["MyWindowRegion"].GetView("MyView") as MyView;

      if (existingView != null)
      {
        regionManager.Regions["MyWindowRegion"].Remove(existingView);
      }
    }

Это нормально? Знает ли модель представления слишком много о представлении (например, его имя и тип)?

Как и в первом вопросе, на панели инструментов моего модуля, если я нажму кнопку «Запустить модуль», он создаст / отобразит представление. Я сделал так, чтобы, если вид уже был виден, вместо того, чтобы создавать его снова, модель вида просто сфокусировала бы существующую:

    private void LaunchMyView()
    {
      var regionManager = Container.Resolve<IRegionManager>();
      MyView existingView = regionManager.Regions["MyWindowRegion"].GetView("MyView") as MyView;

      if (existingView == null)
      {
        MyView view = Container.Resolve<MyView>();
        view.Title = "MyView Title";
        regionManager.Regions["MyWindowRegion"].Add(view, "MyView");
      }
      else
      {
        regionManager.Regions["MyWindowRegion"].Activate(existingView);
      }
    }

Тот же вопрос. Модель представления знает слишком много о представлении?

Кстати, я использую WindowsRegionAdapter для обработки создания нового представления.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Строго говоря, ViewModel ничего не знает о представлении в вашем коде, но знает о RegionManager (ну, берет его из контейнера), который выполняет эту работу.

Лично для такого рода вещей я предпочитаю использовать шаблон-посредник, чтобы просто публиковать сообщения из ViewModel, такие как "ОК, я здесь". Объект менеджера области будет подписываться на эти сообщения и обрабатывать закрытие соответствующим образом. Таким образом, вы удалили код из вашей ViewModel и, надеюсь, вы почувствуете себя лучше из-за того, что виртуальная машина не может «видеть» View.

В Prism мы используем класс EventAggregator для публикации / подкласса типа CompositeWpfEvent<TPayload>

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

Если все, что вы хотите сделать, это закрыть окно, то используйте свойство IsCancel для кнопки в вашем XAML.

Вот пример:

<Button Content="Close"
        IsCancel="True"
        Width="70" 
        Height="23" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...