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

Мне нравится шаблон MVVM, как только вы начнете его использовать, вы зависите от него.

Я знаю, что в идеальном мире ваш код-код View почти пуст (возможно, какой-то код в конструкторе), и каждый аспект View обрабатывается из ViewModel.

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

В данный момент я придерживаюсь следующего правила:

Если код обработчика событий обрабатывает очень небольшую часть его вида (например, обработчик события нажатия кнопки увеличивает шрифт определенного TextBlock, который находится на одном и том же представлении), тогда это ОК, чтобы реализовать логику внутри обработчиков событий. Но если View необходимо манипулировать бизнес-логикой или доступ к ресурсам, которые находятся за пределами представления, тогда я назначаю эти обязанности ViewModel.

Что вы думаете о моем подходе?

Что вы пытаетесь избежать при использовании обработчиков событий и ViewModel?

Какие рекомендации вы можете рекомендовать при использовании шаблона MVVM?

Ответ 1

Я бы сказал, что ваше эмпирическое правило не плохо.

На мой взгляд, основная проблема заключается в том, что "является специфичным для кодового представления, или он обращается к бизнес-логике?".

В порядке, чтобы иметь код в представлении, если этот код строго здесь, чтобы изменить представление и не выполнять какой-либо бизнес-логики. Ваш пример изменения размера шрифта - яркий пример кода, который отлично выглядит в представлении (и увеличит шум в ViewModel, что затруднит понимание и поддержку). По сути, вы уже это делаете, если используете триггеры, так что это не так странно.

Имейте в виду, что если вы используете модульные тесты, будет очень сложно проверить этот бит логики. Если вам нужно его протестировать, вам может быть лучше помещать его в viewmodel.

Ответ 2

Я думаю, что могу добавить и предыдущий комментарий,

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