Подтвердить что ты не робот

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

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

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:

<Window x:Class="WpfApplication.Mvvm.Windowclosing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication.Mvvm.Windowclosing"
        local:DialogCloser.DialogResult="{Binding DialogResult}"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Text}" Grid.Row="0"/>
        <Button Grid.Row="1" Command="{Binding CloseCommand}">Close Me</Button>
    </Grid>
</Window>

Что я здесь не так делаю?

4b9b3361

Ответ 1

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

Ответ 2

Я столкнулся с этой проблемой, когда создал окно, которое вызывалось через ShowDialog(). В окне у меня был Ok_Clicked, который включал кучу утверждений. Чтобы "гарантировать" диалог вернул false, если что-то было не так, я сначала инициализировал DialogResult как false. Если все было правильно, я затем установил DialogResult в true и закрыл окно. Я продолжал получать то же исключение.

Я узнал, что если бы DialogResult не был установлен в true, ShowDialog всегда возвращал бы false. Когда я удалил DialogResult = false в начале Ok_Clicked, я больше не получил исключение.

Ответ 3

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

Ответ 4

Для тех, кто использует ShowDialog, вы можете удалить свойства с кнопки:

IsCancel= истина а также IsDefault= истина

Ответ 5

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

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

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

Ответ 6

Я столкнулся с той же проблемой, используя ShowDialog() и установив результат перед вызовом close.

Однако я сделал скрыть диалог перед установкой результата. Таким образом, при настройке DialogResult значение Visibility должно быть установлено на Visible, и Hidden and Collapsed даст вам ошибочную ошибку, которую "DialogResult" можно установить только после создания окна и отображения в виде диалога. ".

Ответ 7

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

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

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

Ответ 8

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

Но этого уже достаточно, если вы только установите для DialogResult значение True, и после этого окно автоматически закроется, и нет необходимости вызывать метод Close().

Ответ 9

Я получил эту ошибку и решил ее, установив DialogResult перед любым другим кодом в обработчике события click. Когда это было в конце, как раз перед Close, я получал ошибку. Но с этим в начале это работает. Надеюсь, это кому-то поможет, это сводило меня с ума, прежде чем я наконец заработал.