WPF中的通用模态对话框

时间:2014-05-27 07:10:03

标签: c# wpf

我有一个通用的模态对话框视图,它从viewmodels调用,如下所示:

NotificationMessageViewModel vm = new NotificationMessageViewModel()
                {
                    MessageContent = jobExistMsg,
                    MessageHeader = "Warning",
                    MessageType = NotificationMessageType.Warning,
                    Type = ModalType.OkCancel
                };
                mainEntity.ModalContent = vm;
                vm.CloseRequested += ImportJobConfirmation_CallBack;

这种方法的问题是,我不能在while循环中使用此代码,因为代码执行会忽略CloseRequested事件。目前的解决方法是,我有CloseRequested的回调函数,我在callback函数内再次为循环中的其他项调用相同的函数。所以它的递归调用。

有没有更好的解决方案来处理这种情况?

修改

我编辑了一点代码。 假设我有10条记录,我希望在循环处理时存在的每条记录都有这个模态弹出窗口。如果我将在while循环中编写此代码,我将只看到10个记录的弹出窗口,并且关闭请求将仅被触发一次,因为我应该获得每个现有记录的模态(比如5个现有记录)。

1 个答案:

答案 0 :(得分:1)

您可以使用async / await组合来获得所需内容。我刚刚用一个普通的窗口实现了它,但你可以很容易地调整它以使用视图模型。

在辅助窗口(您的案例中为视图模型)中,提供一个等待显示窗口的方法:

public partial class Window1 : Window
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();

    public Window1()
    {
        InitializeComponent();

        this.Closed += Window1_Closed;
    }

    void Window1_Closed(object sender, EventArgs e)
    {
        tcs.SetResult(null);
    }

    public async Task ShowAsync()
    {
        Show();
        await tcs.Task;
    }
}

然后在调用窗口中,您可以连续显示任意数量的窗口,并等待它们关闭:

async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < 10; ++i)
    {
        var secondaryWindow = new Window1();
        await secondaryWindow.ShowAsync();
    }
} 

如果您愿意,还可以在tcs.Task的属性中公开{​​{1}}。这样可以让您更灵活。 E.g:

Window1

其中

var secondaryWindow = new Window1();
secondaryWindow.Show();
await secondaryWindow.WaitForCloseTask;