Я пытаюсь реализовать этот 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:
Что я делаю неправильно?
Установка результатов диалога работает только при открытии формы с помощью ShowDialog (). Эта ошибка появляется при попытке установить результат диалога в форме, открытой с помощью Show ().
Я наткнулся на альтернативный ответ, который может помочь другим. Я закончил тем, что вызвал Close () в окне перед установкой DialogResult. Убедитесь, что вы этого не делаете - это вызовет эту ошибку.
Вы пытаетесь установить Window.DialogResult
слишком рано из-за привязки. Предположительно ваша реализация DialogCloser.DialogResult
(которую вы нам не показали) также устанавливает DialogResult
в Window
. Попробуйте изменить режим привязки на OneWayToSource
, чтобы изменения распространялись только на вашу виртуальную машину, а не наоборот:
local:DialogCloser.DialogResult="{Binding DialogResult, Mode=OneWayToSource}"
Или, может быть, это просто вопрос изменения вашего поведения, чтобы установить Window.DialogResult
только если Window
был показан как диалог. Трудно сказать, не видя всего.
Для меня, как и для Jarvis, эта ошибка была вызвана установкой DialogResult после вызова Close () для окна, которое было показано с помощью ShowDialog ().
В моем случае, я думаю, это было потому, что я переносил код из WinForms в WPF. Этот порядок работал в WinForms, но WPF это не нравится.
Я пробовал другие исправления, такие как удаление атрибутов isDefault и isCancel из моих кнопок, но они не имели никакого эффекта.
Я имел
IsDefault="True"
свойство, определенное на больше чем один кнопка.