+4  A: 

Here's my opinion, for what it's worth :

I don't really agree with the approach you suggest (except for the dumb view). In real life, you will often have to use an existing model : it could be legacy code that you don't have the time (or will) to change, or even a library for which you don't have the code. In my opinion, the model should be completely unaware of the way it will be displayed, and should be easily usable in a non-WPF application. So it doesn't have to implement any specific interface like INotifyPropertyChanged of INotifyCollectionChanged to make it usable in MVVM. I think that all the logic related to UI should reside in the ViewModel.

Regarding RoutedEvents and RoutedCommands, they are not really suitable for use with the MVVM pattern. I usually try to use as little RoutedEvents as possible, and no RoutedCommands at all. Instead, my ViewModels expose RelayCommand properties that I bind to the UI in XAML (see this article by Josh Smith for details on RelayCommand). When I really need to handle events for some control, I use attached behaviors to map the events to ViewModel commands (have a look at Marlon Grech's implementation)

So, in summary :

  • Dumb View
  • Big and smart ViewModel
  • Any model you want or have to use

Of course it's just my approach, and it may not be the best, but I feel quite comfortable with it ;)

Thomas Levesque
Very insightful, especially regarding the model, that you should be able to use the MVVM pattern to hook up to data classes from old projects which have no knowledge of WPF. Interesting the you think RoutedEvents and RoutedCommands are not really suitable for MVVM, I thought they were made to be used in decoupling patterns such as MVVM. Thanks for the feedback.
Edward Tanguay
I refactored this example based on this feedback, put the logic up into the ViewModel: http://stackoverflow.com/questions/857820/big-smart-viewmodels-dumb-views-and-any-model-the-best-mvvm-approach
Edward Tanguay