【发布时间】:2021-12-30 22:04:44
【问题描述】:
我正在开发 WPF (MVVM) 应用程序。我有一个正在显示的消息对话框。它应该只显示一次,但显示两次。此对话框位于 OnCanSaveExecute() 方法中,该方法执行一些验证以启用按钮。
if (!_overUnderPayment)
{
MessageDialogResult result = _messageDialogService.ShowOkCancelDialog($"Text goes here",
"Proceed?");
if (result == MessageDialogResult.OK)
{
_overUnderPayment = true;
return true;
}
else
{
_overUnderPayment = true;
return false;
}
}
_overUnderPayment 一开始是假的。如您所见,我在条件逻辑中将其设置为 true。
_messageDialogService 是...
public MessageDialogResult ShowOkCancelDialog(string text, string title)
{
MessageBoxResult result = MessageBox.Show(text, title, MessageBoxButton.OKCancel, MessageBoxImage.Hand);
return result == MessageBoxResult.OK
? MessageDialogResult.OK
: MessageDialogResult.Cancel;
}
代码运行,对话框正确显示。我可以单击“确定”或“取消”,它会消失,然后再次显示。
我使用断点单步执行代码,在它第一次运行时,它完全按照设计执行并点击返回语句并结束该方法。
然后它跳回到我上面的 if 语句(即使 _overUnderPayment 为真)并重新显示。
我想知道为什么它显示两次。
【问题讨论】:
-
我不确定是否是这种情况,但我知道如果多次设置数据上下文可能会发生奇怪的事情。也许父窗口设置了视图模型,但它的子用户控件也设置了它。或者类似的东西。
-
我有一个嵌入了另一个 UC 的用户控件。他们每个人都有自己的数据上下文。我正在使用 Prism Event Aggregator 在两者之间进行通信,但上述代码都在单个 VM 中……父级。
-
什么是
MessageBox.Show?你说你正在使用棱镜,是吗?您在使用 Prism 的对话服务吗?因为我是并且我没有看到任何类型的Show函数,例如您调用的MessageBox.Show。 Prism 给了我一个IDialogService接口,它的Show函数要求调用者提供要在对话框完成时回调的Action。那你叫什么? -
MessageBox.Show 是本机 C# 消息方法。我只使用 Prisms 事件聚合器服务,而不是他们的消息服务。
-
我想你说的是 Windows 窗体,是吗? (没有“原生 C# 消息方法”)