Почему ICommand лучше кода за вызовом виртуальной машины?
У меня есть сотрудник, который спросил меня, почему он должен использовать шаблон ICommand.
Он хочет добавить кнопку, а затем сделать для нее событие в коде. Затем из события он хочет вызвать метод в ViewModel.
Я дал ему очевидный ответ: Это добавляет связь между View и ViewModel. Но он утверждал, что View и ViewModel уже связаны. (Мы устанавливаем наше представление DataContext в ViewModel в коде просмотра позади: DataContext = new MyViewModel();
Да, я сказал ему, что его способ добавляет "больше сцепления", но это звучало немного хромой даже для меня.
Итак, я знаю, что ICommand - это чистый путь, и я делаю так. Но что еще может купить ICommand, не используя уже существующую связь?
Ответы
Ответ 1
-
Это не о развязывании, а о том, насколько глубоко вы можете проникнуть внутрь своей иерархии ModelView: не накачка событий, а маршрутизация событий, встроенная в инфраструктуру.
-
Об управлении UI: команда имеет состояние (CanExecute), если назначить команду элементу управления, если состояние команды становится false
, управление становится отключенным. Это дает вам мощный интерфейс управления пользовательским интерфейсом, избегая большого количества спагетти-кодирования, особенно для сложного интерфейса.
Ответ 2
У меня есть сотрудник, который спросил меня, почему он должен использовать ICommand шаблон.
Похоже, это означает стандарт в вашей компании (явно или не указано). Это должно быть достаточно для ответа на его вопрос.
Если весь корпоративный код должен использовать этот шаблон, он может вызвать путаницу и разочарование со стороны разработчиков, когда кто-то еще должен отлаживать свой код.
Кроме того, на мой взгляд, использование ICommand быстрее развивается/макетируется, потому что вам не нужно иметь свойство ICommand в контексте для запуска вашей программы. Это позволяет вашим дизайнерам пользовательского интерфейса (если вам посчастливилось иметь их) полностью завершить свои задачи, даже если вы отстаете в своем кодировании.
Ответ 3
ICommand также может предоставить вам место для обработки, или не может быть использована конкретная кнопка. это будет обрабатываться методом canececute.
Ответ 4
Вы можете привязать метод CanExecute
команды к свойствам элемента управления, а также Command
инкапсулирует действие с хорошим способом. По моему мнению, этот подход имеет большой смысл, потому что у вас есть как условие, так и действие выполнения в одной абстракции, что упрощает понимание и проверку.
Если в будущем вы обнаружите, что это действие повторяется, вы можете легко его абстрагировать в своей собственной пользовательской ICommand и использовать его в нескольких местах.
Ответ 5
Одна вещь, которую я не вижу в предыдущих ответах, заключается в том, что использование ICommand способствует повторному использованию кода, позволяя использовать одно и то же действие различными компонентами GUI. Например, если у меня была команда, которая должна привести к открытию окна, и эта команда может быть вызвана в три или для разных экранов в приложении, реализация ICommand позволяет мне определить эту логику в одном месте. С обработчиками событий с кодом-кодом мне приходится копировать и вставлять избыточный код в нарушение DRY (иначе мне пришлось бы сворачивать мою собственную реализацию, абстрагируясь до класса, и в этот момент я мог бы также использовать ICommand).