MessageBox.Show不阻塞线程

时间:2014-08-06 21:22:58

标签: c# silverlight mvvm csla

我正在使用MVVM模式在基于Silverlight的网站上进行维护,并基于CSLA框架构建其业务逻辑。最近出现了一个奇怪的问题,我必须多次点击保存才能在屏幕上显示保存对话框。经过一番调查后,我发现MessageBox OK / Cancel对话框应该阻止线程直到单击OK或Cancel,让线程逐步完成,而屏幕上根本不显示任何内容。以下是viewmodel基类中的相关方法:

    private void SavingProcess(object sender, ExecuteEventArgs e)
    {
        IsSavedProcessCancelled = true;
        MessageBoxResult result;

        if (IgnoreSaveMessageBox) 
            result = MessageBoxResult.OK;
        else
            result = MessageBox.Show("Are you sure want to save the data?", "Data Changes", MessageBoxButton.OKCancel);

        if (result == MessageBoxResult.OK)
        {
            IsSavedProcessCancelled = false;
            base.Save(sender, e);
        }
    }

IgnoreSaveMessageBox为false,代码的执行正确地转到else语句。当我单步执行它时,它会像任何其他行一样通过MessageBox.Show()行。更奇怪的是,结果实际上后来的值为'None',而不是像我预期的那样为null。

我决定尝试在while循环中包装第一个if / else语句以查看会发生什么(我意识到这是一个非常粗糙的事情,并且即使它已经工作也不会接受它作为解决方案) :

        MessageBoxResult result = MessageBoxResult.None;

        while (result != MessageBoxResult.OK)
        {
            if (IgnoreSaveMessageBox)
                result = MessageBoxResult.OK;
            else
                result = MessageBox.Show("Are you sure want to save the data?", "Data Changes", MessageBoxButton.OKCancel);
        }

这最终会导致对话显示,但循环需要8到9次迭代。这也只发生在我试图保存一个完整列表项的特定网格时,列表必须是30多个项目大;较小的列表没有这个问题。

我通过在这个特定实例中保存时将'IgnoreSaveMessageBox'设置为true来解决这个问题,但是我希望有人可以让我正确地解决这个问题。谢谢你的阅读!

0 个答案:

没有答案