2015-05-20 4 views
0

Я действительно изучаю шаблон MVVM.Зачем использовать команды в MVVM

Я ничего не могу понять о командах. Зачем ими пользоваться? Почему бы просто не использовать функцию (в View), которая вызывает функцию ViewModel? Какие команды нам дают? По-видимому, они широко используются, но я не могу найти почему.

+0

Вы используете команды для выполнения делегатов с вашего * вида * на вашу * модель просмотра *, а не с вашей * viewmodel * на вашу * модель *. Ваша модель должна в основном быть вашим POCO, в то время как ваш 'ViewModel' содержит большую часть логики, вызванной вашими представлениями. –

+0

@YuvalItzchakov Не совсем. Логика также может войти в модель. –

+0

@SriramSakthivel Мне нравится, когда вы говорите не на основе мнения вещей :) Это вопрос вкуса, ваша модель может иметь логику, я не сказал, что это невозможно. Я сказал * most *, потому что это то, как я это рассматриваю. –

ответ

4

Зачем нужны команды?

Потому что команды обеспечивают инкапсуляцию. Вы можете скрыть любую сложную логику внутри ICommand, и вы можете поменять ее, когда захотите. Чтобы ваш просмотр не нуждался в знаниях о ваших методах ViewModel и т. Д. Просто нужно знать, что ViewModel предоставляет команду для выполнения операции «x».

Более того ICommand интерфейс поддерживается многими каркасных элементов, как Button, MenuItem и т.д. Когда у вас есть ICommand вы можете связать его с видом --Оно будет заботиться о выполнении команды.

Почему бы не просто использовать функцию (в представлении), которая вызывает функцию ViewModel ?

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

Предположим, если у вас есть логика в вашем представлении. Однажды ваш менеджер может подойти и сказать, что нам больше не нужен этот пользовательский интерфейс (он выглядит не очень хорошо). Сделайте это чем-то привлекательным. Необходимо пересмотреть не только представление, но и повторить логику в режиме просмотра. Это повторная работа (против принципа DRY), может вводить новые ошибки, потому что ваш пользовательский интерфейс изменился и т. Д.

Еще одно главное преимущество разделения View и Logic заключается в том, что вы можете легко отладить логику (в ViewModel и Model).

+0

Отличное объяснение. И если я понимаю, «ViewModel» предоставляет команду, и нет необходимости создавать функцию в коде «View». Я прав? – ZwoRmi

+0

@ZwoRmi Точно. Когда вы знаете, что в «ViewModel» будет команда, вам не нужен код для просмотра, и вы можете напрямую настроить viewmodel. Если привязка правильная, тогда вам не нужно тестировать пользовательский интерфейс. –

2

Другим преимуществом использования ICommand является его метод bool CanExecute(). Вы можете контролировать и контролировать состояние и определять условия, когда ваш ICommand может и будет вызван. Кроме того, например, Button с привязкой ICommand автоматически отключается, если CanExecute() возвращает значение false (не забудьте вызвать метод ICommand каждый раз, когда свойство (y/sies), которое влияет на (-ы) CanExecute(), изменить (и) его/их значение). Кстати, семантика использования этого шаблона описана в других ответах.

+0

, но не забудьте поднять 'CanExecuteChanged' и/или вызвать' CommandManager.InvalidateRequeryS предложены' при необходимости, если вы измените свойство, влияющее на CanExecute() '... – eFloh

+0

@eFloh, определенно и очевидно. Отредактировал ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^