How have you successfully implemented MessageBox.Show() functionality in MVVM?

后端 未结 12 1306
清歌不尽
清歌不尽 2020-11-28 05:55

I\'ve got a WPF application which calls MessageBox.Show() way back in the ViewModel (to check if the user really wants to delete). This actually works

相关标签:
12条回答
  • 2020-11-28 06:41

    Of the two you mention, I prefer option #2. The Delete button on the page just makes the "Confirm Delete Dialog" appear. The "Confirm Delete Dialog" actually kicks off the Delete.

    Have you checked out Karl Shifflett's WPF Line Of Business Slides and Demos? I know he does something like this. I'll try to remember where.

    EDIT: Check out Demo #11 "Data Validation in MVVM" (EditContactItemsControlSelectionViewModel.DeleteCommand). Karl calls a popup from the ViewModal (What!? :-). I actually like your idea better. Seems easier to Unit Test.

    0 讨论(0)
  • 2020-11-28 06:41

    I recently came across this problem where I had to replace the MessageBox.Show in the ViewModels with some fully MVVM complaint message box mechanism.

    To achieve this I used InteractionRequest<Notification> and InteractionRequest<Confirmation> along with interaction triggers and wrote my own Views for the message box.

    What I've implemented is published here

    0 讨论(0)
  • 2020-11-28 06:45

    To expand on Dean Chalk's answer now that his link is kaput:

    In the App.xaml.cs file we hook up the confirm dialog to the viewmodel.

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var confirm = (Func<string, string, bool>)((msg, capt) => MessageBox.Show(msg, capt, MessageBoxButton.YesNo) == MessageBoxResult.Yes);
        var window = new MainWindowView();
        var viewModel = new MainWindowViewModel(confirm);
        window.DataContext = viewModel;
        ...
    }
    

    In the view (MainWindowView.xaml) we have a button that calls a command in the ViewModel

    <Button Command="{Binding Path=DeleteCommand}" />
    

    The viewmodel (MainWindowViewModel.cs) uses a delegate command to show the "Are you sure?" dialog and perform the action. In this example it is a SimpleCommand similar to this, but any implementation of ICommand should do.

    private readonly Func<string, string, bool> _confirm;
    
    //constructor
    public MainWindowViewModel(Func<string, string, bool> confirm)
    {
        _confirm = confirm;
        ...
    }
    
    #region Delete Command
    private SimpleCommand _deleteCommand;
    public ICommand DeleteCommand
    {
        get { return _deleteCommand ?? (_deleteCommand = new SimpleCommand(ExecuteDeleteCommand, CanExecuteDeleteCommand)); }
    }
    
    public bool CanExecuteDeleteCommand()
    {
        //put your logic here whether to allow deletes
        return true;
    }
    
    public void ExecuteDeleteCommand()
    {
        bool doDelete =_confirm("Are you sure?", "Confirm Delete");
        if (doDelete)
        {
            //delete from database
            ...
        }
    }
    #endregion
    
    0 讨论(0)
  • 2020-11-28 06:50

    WPF & Silverlight MessageBoxes

    MVVM supported

    http://slwpfmessagebox.codeplex.com/

    0 讨论(0)
  • 2020-11-28 06:53

    I just create an interface (IMessageDisplay or similar) which gets injected into the VM, and it has methods like a MessageBox (ShowMessage() etc). You can implement that using a standard messagebox, or something more WPF specific (I use this one on CodePlex by Prajeesh).

    That way everything's separated and testable.

    0 讨论(0)
  • 2020-11-28 06:54

    I've made a simple MessageBox wrapper control for us to use in pure MVVM solution and still allowing unit testing capability. The details are in my blog http://geekswithblogs.net/mukapu/archive/2010/03/12/user-prompts-messagebox-with-mvvm.aspx

    mukapu

    0 讨论(0)
提交回复
热议问题