Использование команд, объявленных в «родительском» ViewModel (MVVM) - PullRequest
3 голосов
/ 16 ноября 2011

(Примечание. Я решил не использовать Navigation Framework)

У меня есть WizardViewModel, который связан с WizardView.
WizardViewModel объявляет и создает команду «Далее».
Он также содержит свойство «ActiveSpell» типа SpellViewModel.

SpellViewModel содержит несколько PageViewModel, каждая из которых имеет аналог View.
Свойство ActivePage (в SpellViewModel) сообщает пользовательскому интерфейсу, какой вид выбрать.

Теперь у меня есть следующая проблема:
Когда я нажимаю кнопку, чтобы перейти на следующую страницу,
Мне нужен доступ к команде «Далее», определенной в WizardViewModel,
но у меня есть доступ только к PageViewModel.

Я мог бы просто добавить свойство Parent к каждому дочернему ViewModel,
но я не уверен, что это хорошая идея.
Или, может быть, есть другой более приятный / распространенный способ сделать это.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Вы можете использовать Event Aggregator , чтобы настроить взаимодействие между ViewModels.

2 голосов
/ 16 ноября 2011

Вам не нужно родительское свойство.Структура вашей модели представления хороша, просто посмотрите на изображение, чтобы понять, как вам следует привязать модель представления к представлению:

enter image description here

Следующая команда должна быть реализована примерно так:

public void NextExecute()
{
    ActualSpell.MoveToNextPage();
}

ОБНОВЛЕНИЕ: Согласно вашему комментарию, Арох, я обновил пост.Я думаю, что в этом случае вы должны реализовать команду ActivateCreatePersonSpell в WizardViewModel. Эта команда должна:

  • сохранить фактическое состояние заклинания
  • открыть заклинание CreatePerson
  • после создания человекаустановить сохраненное заклинание с результатом создания персонажа

Последнее, что вам нужно сделать, это привязать команду ActivateCreatePersonSpell к кнопке на странице.Я предлагаю использовать ViewModelLocator для этих целей. Посмотрите эту запись, например.

1 голос
/ 16 ноября 2011

Мне пришлось один раз реализовать мастер, и мне понравилось и подражало способ, которым Джош Смит и Карл Шиффлетт настраивали свои модели WizardViewModel и представления страниц мастера в этом примере проекта (исходный код доступен со статьей):

http://www.codeproject.com/KB/WPF/InternationalizedWizard.aspx

Они сохранили команду Next как часть своей WizardViewModel, но создали WizardPageViewModelBase, из которой происходят все страницы мастера.Это позволило WizardViewModel контролировать, какая страница является текущей страницей, и позволило WizardViewModel запросить текущую модель просмотра страницы, чтобы узнать, может ли команда Next выполняться, таким образом, включив или отключив кнопку Next в мастере.(То есть модель представления мастера знает о моделях представления страницы, но модели представления страницы не должны ничего знать о «родительской» модели представления мастера.)

Что касается добавления ссылок в родительское представлениемодели, это подход, который работает, и я делал это раньше, когда начал работать с MVVM, но со временем я обнаружил, что этот подход приводит к некоторому сложному в обслуживании коду, поскольку каждая модель представления становится взаимозависимой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...