MVVM, Should I use ICommand on all controls?

Posted on

Question :

The use of commands through the ICommand interface is part of the MVVM. The question is, should I use commands on all controls? Even those who are not connected with the business rule?
For example, a HambugerButton whose sole purpose is to expand or collapse HambugerMenu . Should I apply Command to it too?


Answer :

Yes, my opinion is that you should use Commands in all situations, because it maintains the consistency of the MVVM pattern and does not cause confusion, because mixing code-behind with MVVM will cause a to tinker with your code because the features will be mixed in different parts of the code.

For example, look at how a MVVM ployment gets clean and straightforward:

Using the example of opening a control with a button.

// XAML - HamburgerMenu
<controls:HamburgerMenu IsOpen={binding MenuIsOpen} />

The Boolean property IsOpen of HambugerMenu has been bound to a Boolean property of my view-model called MenuIsOpen .

// View-Model
public bool MenuIsOpen { get; private set; } // Implementar INotifyPropertyChanged

You have the button that expands (opens) HamburgerMenu .

 // XAML - Button
 <controls:Button Command={binding OpenMenu} />

The button command was connected to ICommand of my view-model named OpenMenu .

// View-Model
public ICommand OpenMenu = new RelayCommand(OpenMenuCommand);

private void OpenMenuCommand()
   MenuIsOpen = !MenuIsOpen; // Alterna entre aberto e fechado.

Ready, this way you switch between open and closed your HamburgerMenu, no events, no code-behind, no surprise code.

In the example above, any method within your view-model can control the opening and closing of your hamburgerMenu through the MenuIsOpen property, which is very good for code reuse because if there is any routine in which you you need to control the opening of the control, it is already available to you, which would not be possible with code-behind (not in a clean way), so you continue in the MVVM pattern, have a clean code, your view contains only bindings , the view-model does not even know about the controls.


Leave a Reply

Your email address will not be published. Required fields are marked *