Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In MVVM, what is the best way for the ViewModel to respond to user actions in the View?

Tags:

I understand that in MVVM:

  • the View knows about the ViewModel
  • the ViewModel knows about the Model
  • but it doesn't work upwards, so the Model knows nothing about the ViewModel
  • and the ViewModel knows nothing about the View

So how does the ViewModel respond to actions that the user does on the View, e.g. type something into a TextBox or move a slider, etc.

  1. I understand that this is done with RoutedEvents but almost all RoutedEvent examples I find use CodeBehind in the View, which is exactly what you don't have anymore in MVVM.

  2. So that leaves RoutedCommands which I find more examples of in MVVM but e.g. moving a slider really isn't a command in that sense, it is an event, so I am wondering if this is really what should be used.

  3. Then I read advice such as "In MVVM use RoutedEvents as little as possible, and no RoutedCommands at all." OK.

  4. So that leaves, e.g. in the WPF Model-View-ViewModel Toolkit 0.1 project form the WPF team themselves you have a "DelegateCommand" which also looks like an interesting way.

  5. Then some people are also using "RelayCommand".

This is a lot of choices and confusion for doing something so core to developing applications.

What is the best way to simply do in MVVM what we were doing for the last 10 years with Code Behind:

  • create button
  • double-click button
  • write handling code
like image 674
Edward Tanguay Avatar asked May 13 '09 14:05

Edward Tanguay


People also ask

What is the use of ViewModel in MVVM?

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.

What is the role of ViewModel?

The purpose of the ViewModel is to acquire and keep the information that is necessary for an Activity or a Fragment. The Activity or the Fragment should be able to observe changes in the ViewModel. ViewModels usually expose this information via LiveData or Android Data Binding.

Should ViewModel know about view?

In fact - the ViewModel shouldn't care about the View at all. It should simply make data available through properties, and it's up to the View to decide what it will dynamically bind to in the ViewModels. If the ViewModel wants to tell the View something this should occur implicit through Bindings.


1 Answers

Just to be clear, when people mention DelegateCommand and RelayCommand, they are really talking about the same thing: an implementation of ICommand that allows you to pass in a delegate. You can use them interchangeably.

As far as I am concerned, having your view (XAML) bind to DelegateCommands in the ViewModel is the best way to implement MVVM.

I stay away from RoutedEvents AND code-behind whenever possible.

like image 83
Brian Genisio Avatar answered Sep 30 '22 01:09

Brian Genisio