Где обращаться с логикой в ​​моделях представления MVVM? - PullRequest
1 голос
/ 25 ноября 2011

После некоторого начального чтения WPF и MVVM я сейчас работаю над небольшим отладочным приложением для цифрового контроллера ввода-вывода.В этом приложении у меня есть дерево моделей представлений, которое выглядит следующим образом:

IOControllerViewModel> ConfigurationViewModels> PortViewModels> ChannelViewModels

Это соответствует бизнес-объектам, где IOController содержит наборконфигураций, который затем содержит список портов, который затем содержит список каналов, которые в конечном итоге представляют каналы ввода / вывода контроллера ввода-вывода.

Но теперь мой вопрос заключается в том, где обращаться с «логикой»?

Например, я хочу переключить состояние выходного канала.IOControllerViewModel в настоящее время является единственным экземпляром, который имеет ссылку на бизнес-объект, который содержит необходимый метод ToggleChannel ().Теперь я вижу три варианта:

  1. Поместите имя входа в ChannelViewModel.Таким образом, передайте необходимый бизнес-объект от моего корня до самого листа.

  2. Поместите логику в IOControllerViewModel.Таким образом, событие или что-то подобное должно запускаться ChannelViewModel, а затем обрабатываться IOControllerViewModel.

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

  4. Любой другой вариант?Лучшая практика?

Спасибо большое!

Ответы [ 2 ]

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

Обычно я помещаю логику в слой, который его использует, и использую систему обмена сообщениями, такую ​​как PRISM EventAggregator или MVVM Light Messenger, для связи между ViewModels. (Если вам интересно, я написал краткий пост об этом здесь )

В вашем случае это зависит от того, какой слой обрабатывает вход в систему. Например, если LoginViewModel успешно аутентифицирует пользователя, он будет передавать что-то вроде UserAuthenticated сообщения, содержащего соответствующие параметры. Заинтересованные ViewModels могут подписаться на UserAuthenticated сообщения и обрабатывать их соответствующим образом.

Имейте в виду, что с MVVM ваши ViewModels - это ваше приложение. Приложение должно работать без каких-либо представлений (например, из сценария тестирования)

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

Если я правильно вас понял, вы используете иерархическую структуру, которая может работать только с одной ViewModel, IOControllerViewModel.Все эти конфигурации, порты и каналы могут быть наблюдаемыми свойствами или коллекциями соответствующего элемента.

Затем вы просто используете IOControllerView, который содержит ItemsControl, который осуществляет доступ ко всем конфигурациям.В DataTemplate каждого элемента конфигурации у вас будет ItemsControl, который использует порты в качестве ItemsSource и т. Д.

Нехорошо иметь больше ViewModels, чем необходимо, особенно если нет необходимости в View, потому что вы можете использоватьвместо этого DataTemplate.

Надеюсь, я вас правильно понял.

...