Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Showing a message box from the ViewModel is a violation of MVVM - how to avoid?

Tags:

c#

mvvm

While watching a video about MVVM on Pluralsight there was a situation where the MVVM pattern got violated but no correct way of doing it was shown:

  • The view had a button that uses ICommand to trigger a handler in the ViewModel.
  • The handler correctly relayed the execution to a repository implementation.
  • The concrete implementation of the repository called a web service method.

However: if the webservice call failed, the ViewModel would bring up a message box that informs the user about the error. As the ViewModel is an abstraction of the View, it should not directly create UI, but what is the 100% clean way to get that message box presented to the user?

like image 837
Krumelur Avatar asked Jun 01 '13 21:06

Krumelur


1 Answers

Create a service:

interface IDialogService
{
    void ShowMessageBox(string message);
}

Implement it:

class DialogService : IDialogService
{
    public void ShowMessageBox(string message)
    {
        MessageBox.Show(); // ...
    }
}

Use dependency injection:

class ViewModel
{
    [Import] // This is MEF-specific sample
    private readonly IDialogService dialogService;
}

or service location:

class ViewModel
{
    private AnyCommandExecute()
    {   
        // This is MEF-specific sample
        var dialogService = container.GetExportedValue<IDialogService>();
    }
}

to obtain a concrete IDialogService in your view model, then call the obtained implementation from ViewModel.

The same approach is applicable for any other similar cases: show open/save dialog, show your custom view model in dialog.

like image 98
Dennis Avatar answered Sep 17 '22 06:09

Dennis