I just started experimenting with Laurent Bugnion's MVVM Light Toolkit. I think I'm going to really like it, but I have a couple questions.
Before I get to them, let me explain where I'm coming from. I currently use a combination of Josh Smith's MVVM Foundation and another project on Codeplex called MVVM Toolkit. I use ObservableObject and Messenger from MVVM Foundation and DelegateCommand and CommandReference from MVVM Toolkit.
The only real overlap between MVVM Foundation and MVVM Tookit is that they both have an implementation for ICommand: MVVM Foundation has RelayCommand and MVVM Tookit has DelegateCommand. Of these two, DelegateCommand appears to be more sophisticated. It employs a CommandManagerHelper that uses weak references to avoid memory leaks.
With that said, here are my questions:
Why does MVVM Light use
RelayCommandrather thanDelegateCommand? Is the use of weak references in anICommandunnecessary or not recommended for some reason?Why is there no
ObservableObjectin MVVM Light?ObservableObjectis basically just the part ofViewModelBasethat implementsINotifyPropertyChanged, but it's very convenient to have as a separate class because view-models are not the only objects that need to implementINotifyPropertyChanged. For example, let's say you have a DataGrid that binds to a list ofPersonobjects. If any of the properties inPersoncan change while the user is viewing the DataGrid,Personwould need to implementINotifyPropertyChanged. (I realize that ifPersonis auto-generated using something like LinqToSql, it will probably already implementINotifyPropertyChanged, but there are cases where I need to make view-specific versions of entity model objects, say, because I need to include a command to support a button column in a DataGrid.)
Thanks.
P.S. Here is the code for DelegateCommand from the MVVM Toolkit:
https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU
It looks like the issue raised by the first question has been solved in the latest build:
According to The MVVM Light Toolkit Codeplex site (under "Raising the CanExecuteChanged event manually"), the
CommandManagerhas been eliminated altogether.As for
Observable Object, I have added an item to the Issue Tracker on the Codeplex Site.