Я создал MainWindowViewModel и с этого момента использую класс RelayCommand для ... передачи команды. Нарушаю ли я какие-либо рекомендации, используя MenuItem из MainWindow, чтобы его команда была привязана к свойству этой модели представления?
Нет, это именно то место, куда вы помещаете команды.
Это действие, к которому я привязываю команду MenuItem, собирается создать новую ViewModel и новый View и показать его. Опять же, это нормально в контексте MVVM?
Не нужно знать, как создать новое представление; это работа представления. Особенности того, как это сделать, зависят от того, как вы показываете это новое представление - это может быть так же просто, как наличие ContentPresenter в представлении, которое привязано к свойству в модели представления, поэтому, когда вы устанавливаете свойство (и поднимаете PropertyChanged ) ContentPresenter отображает новый объект со связанным с ним DataTemplate.
Вещи становятся немного странными, если под "созданием нового представления" подразумевается "открыть новое окно". Нет особенно элегантного способа сделать это, особенно если вы хотите, чтобы новое окно было модальным диалогом. Одним из способов является добавление обработчика событий в кодовый элемент представления, который прослушивает PropertyChanged в модели представления; когда свойство модели подчиненного представления устанавливается, код в представлении создает и показывает новое окно.
Мое MainWindow будет своего рода «приборной панелью», и у меня будет несколько моделей, прикрепленных к этой приборной панели. Должен ли я просто обернуть все эти модели в одну модель представления?
Конечно. Это действительно распространенная модель. Например, нет ничего необычного в том, чтобы выставить наблюдаемое свойство коллекции и привязать к нему какой-либо ItemsControl; представление автоматически создает представления для каждой модели представления, которую вы помещаете в эту коллекцию. Опять же, конкретная реализация действительно зависит от вашего приложения.