Использование MvvmLight.Messaging.Messenger для создания нового View + ViewModel (Window) - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть MainView и связанный MainViewViewModel, которые связаны ViewModelLocator.

В MainViewViewModel есть команда, которая должна вызвать новый Window, чтобы открыть, который имеет его собственные View и ViewModel (NewView и NewViewViewModel).

Во многих примерах, которые я видел, предлагается использовать Mvvmlight Messenger, чтобы сделать что-то вроде этого:

public class MainViewViewModel
{

    private void OpenNewWindow()
    {
        Messenger.Default.Send(new NotificationMessage("NewView"));
    }

}

А затем зарегистрируйте NewViewViewModel и обработайте сообщение следующим образом:

public class NewViewViewModel
{
   public NewViewViewModel()
   {
       Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived);
   }

    private void NotificationMessageReceived(NotificationMessage obj)
    {
         if (obj.Notification == "NewView")
         {
             NewView view = new NewView();
             view.Show();
         }
    }
}

Однако это не работает, потому что NewViewViewModel еще не создан (поэтому не зарегистрирован в Messenger). Кроме того, это не подходит для MVVM, потому что NewViewViewModel отвечает за создание NewView.

Как правильно создать простую команду, которая создает и открывает новую пару View и ViewModel, которые связаны между собой через ViewModelLocator и настройку DataContext="{Binding NewView, Source={StaticResource Locator}}" в NewView.xml?

1 Ответ

3 голосов
/ 21 февраля 2020

Использование службы окон:

MVVM показывает новое окно из виртуальной машины при работе с отдельными проектами

Вы можете либо внедрить модель представления в реализацию IWindowService, либо используйте класс stati c WindowService:

public static class WindowService
{
    public static void OpenWindow()
    {
        NewView view = new NewView();
        view.Show();
    }
}

Очевидно, что внедрение зависимостей предпочтительно для возможности модульного тестирования моделей представления и переключения реализаций IWindowService во время выполнения.

...