I'm actually learning MVVM pattern.
I can't understand one thing about commands. Why use them? Why don't just use a function (in the View
) which call a ViewModel
's function? What commands provide us? Apparently they are widely used, but i can't find why.
Another benefit from using
ICommand
is itsbool CanExecute()
method. You can monitor and control the state and define conditions when yourICommand
can and will be invoked. Plus, for example,Button
with boundICommand
disables itself automatically, ifCanExecute()
returns false (do not forget to callCanExecuteChanged()
method of ICommand every time the propert(y/ies), which affect(s)CanExecute()
, change(s) its/their value). By the way, the semantic of usage of this pattern is described in other answers.Because commands provide encapsulation. You can hide any kind of complex logic inside a
ICommand
and you can swap the implementation whenever you need. So that your View doesn't need to know anything about your methods of ViewModel etc. It just needs to know ViewModel provides a command to do operation "x".More than that
ICommand
interface is supported by many framework elements likeButton
,MenuItem
etc. When you have aICommand
you can bind it to the View --it will take care of executing the command.Because we don't want to mix up the responsibilities. View shouldn't have any logic, it is just a dumb thing which just displays the data to the user. No more.
Assume if you have logic in your view. One day your manager can come up and say we don't need this UI anymore(it doesn't looks good). Make it something attractive. Not only the View have to be redesigned, but you need to repeat the logic in View there. This is repeated work(against DRY principle), can introduce new bugs because your UI has changed etc.
Another main advantage of separating the View and Logic is that you can easily unittest the Logic (in ViewModel and Model).