我正在使用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来解决这个问题,但是我希望有人可以让我正确地解决这个问题。谢谢你的阅读!