如何请求视图显示对话框并从WPF / MVVM模型获取结果?

时间:2019-03-11 13:56:35

标签: c# wpf mvvm

我有一个C#/ WPF应用程序。有一个任务需要长时间运行,它需要一种方法来显示一个对话框,要求用户在某个时候做出决定。任务无法退出并重新启动。它需要保持暂停状态并等待对话结果。有很多方法可以做到这一点。如何在MVVM中正确执行操作?如何从业务逻辑中请求用户交互?

2 个答案:

答案 0 :(得分:0)

这在很大程度上取决于您要实现的目标以及代码的设置方式。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/app-development/dialog-boxes-overview这是一篇很棒的文章,介绍了WPF附带的内置对话框,您也可以创建自己的对话框。

答案 1 :(得分:0)

我有一个单独的dll服务。里面有一个MessageBoxService
该服务引用一个窗口。我将实施权交给您。
我的服务实现了一个可注入的接口,虽然不是,但是以防万一。 以下是其提供的代码段:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;

namespace Services.MessageBox
{
    public class MessageBoxService : IMessageBoxService
    {
        Dispatcher dispatcher;
        private Window mainWindow;

        public MessageBoxService()
        {
            dispatcher = Application.Current.Dispatcher;
            mainWindow = Application.Current.MainWindow;
        }

        private void UIThread(Action execute)
        {
            dispatcher.Invoke(execute);
        }

        public void Show(string caption, string message)
        {
            UIThread(() =>
            {
                System.Windows.MessageBox.Show(mainWindow, message, caption, System.Windows.MessageBoxButton.OK);
            });
        }

        public bool? ShowDialog(string caption, string message)
        {
            bool? result = null;

            UIThread(() =>
            {
                result = new Windows.Modal(message, caption).ShowDialog(mainWindow);
            });

            return result;
        }
    }
}

然后您将在ViewModel中像这样使用它:

var answer = messageBoxService.ShowDialog("Title Here", "Message to display");