I recently started using the MVVM Light framework to create an app. One of the first things that I found tripped me up was trying to link the ViewModel functionality with the visual interface. After a little more searching than should be necessary I came across the concept of commands. Basically, thos allows you to bind the functionality of your view model to an action on the screen. In the example below it’s the action of clicking a button.
First, create a new relay command (this is in the namespace GalaSoft.MvvmLight.Command):
public class MainViewModel : ViewModelBase
{
private readonly IDataService \_dataService;
/// /// The property's name.
///
public const string WelcomeTitlePropertyName = "WelcomeTitle" ;
private string \_welcomeTitle = string.Empty;
// New Command Variable
public RelayCommand SearchCommand { get ; private set ; }
...
Next initialise the command in the constructor of the VM:
public MainViewModel( IDataService dataService)
{
this.SearchCommand = new RelayCommand (this.GetDataCount);
...
Obviously, the execute function must exist. For example:
private void GetData()
{
\_dataservice.GetData((count, error) =>
{
if (error != null)
{
// Report error here
return;
}
// Do something with data here
});
}
Finally, simply add a call from the XAML in MainWindow:
Parameters
You can also pass parameters, by simply providing the CommandParameter attribute and then using it. However, given that you’re already in the databound context (i.e. you’re function is in your ViewModel, which is bound to the DataContext) I didn’t find a need for this, as it’s possible to simply reference the property directly.
Conclusion
This ends up being quite a neat way to link the two. The screen is linked to the view model without having a chunk of code in the button click handler.