WPF MVVM Использование команд и обработчиков событий
Мне нравится шаблон MVVM, как только вы начнете его использовать, вы зависите от него.
Я знаю, что в идеальном мире ваш код-код View почти пуст (возможно, какой-то код в конструкторе), и каждый аспект View обрабатывается из ViewModel.
Но бывают случаи, когда создание новых полей, свойств, команд в ViewModel создает больше кода, чем реализация одной и той же вещи в обработчике событий.
В данный момент я придерживаюсь следующего правила:
Если код обработчика событий обрабатывает очень небольшую часть его вида (например, обработчик события нажатия кнопки увеличивает шрифт определенного TextBlock, который находится на одном и том же представлении), тогда это ОК, чтобы реализовать логику внутри обработчиков событий. Но если View необходимо манипулировать бизнес-логикой или доступ к ресурсам, которые находятся за пределами представления, тогда я назначаю эти обязанности ViewModel.
Что вы думаете о моем подходе?
Что вы пытаетесь избежать при использовании обработчиков событий и ViewModel?
Какие рекомендации вы можете рекомендовать при использовании шаблона MVVM?
Ответы
Ответ 1
Я бы сказал, что ваше эмпирическое правило не плохо.
На мой взгляд, основная проблема заключается в том, что "является специфичным для кодового представления, или он обращается к бизнес-логике?".
В порядке, чтобы иметь код в представлении, если этот код строго здесь, чтобы изменить представление и не выполнять какой-либо бизнес-логики. Ваш пример изменения размера шрифта - яркий пример кода, который отлично выглядит в представлении (и увеличит шум в ViewModel, что затруднит понимание и поддержку).
По сути, вы уже это делаете, если используете триггеры, так что это не так странно.
Имейте в виду, что если вы используете модульные тесты, будет очень сложно проверить этот бит логики. Если вам нужно его протестировать, вам может быть лучше помещать его в viewmodel.
Ответ 2
Я думаю, что могу добавить и предыдущий комментарий,
Вместо использования обработчиков событий из очень скромного опыта команды дают мне большую гибкость в том смысле, что он обеспечивает независимый механизм реагирования на события/действия с разных элементов управления с возможностью проверки состояния самой команды.