Получение "DialogResult может быть установлен только после того, как окно создано и показано как диалог" при реализации паттерна WPF MVVM для закрытия формы

Я пытаюсь реализовать этот MVVM паттерн для закрытия формы WPF, который также объясняется в этом блоге, и я получаю System.InvalidOperationException с сообщением об ошибке "DialogResult может быть установлен только после того, как окно создано и показано как диалог. ", когда я пытаюсь установить Dialog Result на команду кнопки Close:

DialogResult = true;

Вот моя ViewModel:

class MainWindowViewModel:INotifyPropertyChanged
{
    private bool? dialogResult;
    public bool? DialogResult
    {
        get { return dialogResult; }
        set
        {
            if (value != this.dialogResult)
            {
                this.dialogResult = value;
                OnPropertyChanged("DialogResult");
            }
        }
    }

    public string Text
    {
        get { return "Hello!"; }
    }

    void CloseCommandExecute()
    {
        this.DialogResult = true;
    } 

и вот XAML View:


    
        
    
    
        
            
            
        
        
        
    

Что я делаю неправильно?

23
задан Community 23 May 2017 в 11:47
поделиться

5 ответов

Установка результатов диалога работает только при открытии формы с помощью ShowDialog (). Эта ошибка появляется при попытке установить результат диалога в форме, открытой с помощью Show ().

23
ответ дан 29 November 2019 в 01:20
поделиться

Я наткнулся на альтернативный ответ, который может помочь другим. Я закончил тем, что вызвал Close () в окне перед установкой DialogResult. Убедитесь, что вы этого не делаете - это вызовет эту ошибку.

9
ответ дан 29 November 2019 в 01:20
поделиться

Вы пытаетесь установить Window.DialogResult слишком рано из-за привязки. Предположительно ваша реализация DialogCloser.DialogResult (которую вы нам не показали) также устанавливает DialogResult в Window. Попробуйте изменить режим привязки на OneWayToSource, чтобы изменения распространялись только на вашу виртуальную машину, а не наоборот:

local:DialogCloser.DialogResult="{Binding DialogResult, Mode=OneWayToSource}"

Или, может быть, это просто вопрос изменения вашего поведения, чтобы установить Window.DialogResult только если Window был показан как диалог. Трудно сказать, не видя всего.

1
ответ дан 29 November 2019 в 01:20
поделиться

Для меня, как и для Jarvis, эта ошибка была вызвана установкой DialogResult после вызова Close () для окна, которое было показано с помощью ShowDialog ().

В моем случае, я думаю, это было потому, что я переносил код из WinForms в WPF. Этот порядок работал в WinForms, но WPF это не нравится.

Я пробовал другие исправления, такие как удаление атрибутов isDefault и isCancel из моих кнопок, но они не имели никакого эффекта.

0
ответ дан 29 November 2019 в 01:20
поделиться

Я имел

IsDefault="True"

свойство, определенное на больше чем один кнопка.

1
ответ дан 29 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: