Семантически, Команды и Конвертеры должны быть ближе к Views или ViewModels?

Мне интересно, если в MVVM я должен проектировать Конвертеры и Команды, быть ближе к Views или ViewModels. Для меня это серая зона, поскольку они представляют собой два типа клеевых объектов, соединяющих разрыв между компонентами. Возможно, это не имеет большого значения, но мне интересно, что Stack Overflow может сказать об этом.

Я использовал для размещения конвертеров в пространстве имен ViewModel, потому что они часто можно использовать повторно, даже если вид меняется. Однако я вижу все больше и больше комментариев, размещающих их ближе к представлениям. Смотрите лучшие ответы на:
Должен ли ваш ViewModel предоставлять элементы XAML как свойства или нет?
Как можно использовать конвертеры WPF в шаблоне MVVM?

Команды ViewModels обычно предоставляют команды для реализации событий пользовательского интерфейса, поэтому я поместил их также в пространство имен ViewModel. Классическими примерами являются RelayCommands. Затем я наткнулся на интересную схему использования команд для отображения диалогов между основным видом и моделью представления. Я нахожу это просто блестящим благодаря своей простоте. Команда на самом деле просто прокси, но явно в интерфейсе. Или нет? Увидеть:
MVVM и диалоги
Обработка диалогов в WPF с помощью MVVM

Так как вы думаете, Команды и Конвертеры должны жить в MVVM? Посмотреть? ViewModel? Не имеет значения?

1 ответ

Решение

Я не думаю, что вы могли бы сказать, что они находятся в одном лагере или другом. Как вы сказали, их целью является создание моста между ViewModel и View, сохраняя их несвязанными. И, по-моему, это то, как вы должны относиться к ним как к коду.

Конвертеры - вы можете утверждать, что они ближе к представлению, потому что их ответственность связана с тем, как информация адаптируется, чтобы ее можно было легко связать и отобразить в элементах управления xaml.

Кроме того, теоретически вы можете использовать два разных конвертера для одного и того же свойства ViewModel, в зависимости от того, как вы хотите его просмотреть.

Но ничто не мешает вам использовать их в других контекстах, если возникает необходимость, где-то, где View вообще не задействован.

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

Команды - обычно предоставляются ViewModel в MVVM, так что это может быть аргументом, что они ближе к ViewModel, но, по моему опыту, они чаще всего используются для облегчения вызова логики из ViewModel через привязки. Если бы я мог связать вызов метода ViewModel непосредственно в xaml, я бы больше не использовал команды - для простых случаев.

Даже при том, что они обычно привязаны к ViewModel, Команды также могут быть повторно использованы между Views и ViewModel. Если вы обнаружите, что копируете код для команд, вы можете разделить их, поместите ViewModel за интерфейсом и используйте их повторно.

Кроме того, шаблон команды имеет множество применений вне области действия MVVM. (Например, вы можете использовать его в логике приложения для облегчения работы функции "Отменить")

Что касается того, где их разместить - обычно я начинаю с помещения их в ViewModel, и, когда все усложняется, я перемещаю их по мере необходимости. Вот интересный пост о том, что вы можете сделать, когда все усложняется: как я могу избежать беспорядка команд во ViewModel?

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

Другие вопросы по тегам