异常 - 只有在创建Window并显示为对话框后才能设置DialogResult

时间:2016-05-25 11:52:28

标签: c# wpf exception mvvm showdialog

我在关闭对话框时遇到了问题,但只是在第二次显示时才出现问题,只有在以某种方式关闭对话框时才会出现问题。

对话框上有一个单独的按钮,声明为取消按钮,即它具有IsCancel =“True”。按钮单击没有事件处理程序。我可以显示这个对话框,每次单击按钮或按Esc键关闭它,并且没有问题,它每次都有效。

我也有用户会话的概念。如果用户的会话到期,则应自动关闭所有打开的对话框。当会话在第一次显示对话框时到期时,这可以正常工作,但是如果对话框已经显示一次,并且通过明确单击按钮关闭,或者允许会话到期,那么当下一个会话到期时显示对话框时,我得到异常“只有在创建Window并显示为对话框后才能设置DialogResult。”

这很奇怪,因为我可以在第二个会话到期之前查看对话框的DialogResult,它是null。当我在会话到期时设置断点并且我即将设置DialogResult时,DialogResult 已经设置为false。我不知道这是怎么设置为假的。

我正在使用Unity,并想知道它是否每次都给我相同的对话实例。但如果是这样的话,一旦我解决了对话框的引用,DialogResult就不会是假的吗?它不是,它像我期望的那样是空的。

我查看了thisthisthisthis,但都没有帮助。

这是我获得参考并显示对话框的地方

public void ShowLoginBarcode(string username) {
    BarcodeLoginForm frm = _Unity.Resolve<BarcodeLoginForm>();
    frm.Owner = Application.Current.MainWindow;
    BarcodeLoginVM vm = frm.ViewModel;
    vm.Username = username;
    frm.ShowDialog();
}

这是对话框的xaml.cs

public partial class BarcodeLoginForm : Window, ICloseableDialog {
    public void CloseDialog(bool dialogResult) {
        DialogResult = dialogResult;
    }

    private void Window_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) {
        // register the view with the view model, so the view model can call the view's CloseDialog method
        if (e.OldValue != null)
            ((BarcodeLoginVM)e.OldValue).SetView(null);
        if (e.NewValue != null)
            ((BarcodeLoginVM)e.NewValue).SetView(this);
    }
}

这是视图模型的一部分。

public void SetView(ICloseableDialog view) {
    _Dialog = view;
}

private void Session_OnTimeoutChange(object sender, EventArgs e) {
    if (_Session.HasExpired)
        CloseDialog(false);
}

private void CloseDialog(bool dialogResult) {
    _Dialog?.CloseDialog(dialogResult);
}

以下是显示问题的最简单步骤:

  1. 显示对话框。
  2. 单击关闭按钮以关闭对话框。 (或者,让会话过期以便关闭对话框。)
  3. 再次显示该对话框。 (如果我在对话框可见的情况下查看DialogResult,则它为null。我添加了一个KeyPreview事件处理程序,因此我可以在其上放置一个断点。)
  4. 让会话过期。在DialogResult = dialogResult即将在对话框的CloseDialog方法中执行时,DialogResult 已经设置 为假。
  5. 那么,有什么想法吗?

    修改: 我可以通过更改xaml.cs CloseDialog方法来解决问题,以便在分配值之前检查DialogResult是否为null,但我不明白为什么这应该是必要的。在执行此代码之前如何设置DialogResult?

    public void CloseDialog(bool dialogResult) {
        if (!DialogResult.HasValue)
            DialogResult = dialogResult;
    }
    

0 个答案:

没有答案