Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
343 views
in Technique[技术] by (71.8m points)

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

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...