Estoy tratando de implementar este patrón MVVM para el formulario WPF cierre, que también se explica en este blog y estoy participando en el Sistema.InvalidOperationException con el mensaje de error «DialogResult sólo se puede establecer después de la Ventana que se crea y se muestra como diálogo.» cuando estoy tratando de configurar el cuadro de Diálogo Resultado de la Estrecha botón de comando:

DialogResult = true;

Aquí está mi 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;
    } 

y Aquí está la Vista 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>

¿Qué estoy haciendo mal aquí?

InformationsquelleAutor luqi | 2011-11-30

9 Comentarios

  1. 23

    La configuración de un cuadro de diálogo resultado sólo funciona cuando se abre el formulario con ShowDialog(). Usted recibe este mensaje de error cuando intenta establecer el resultado del diálogo en un formulario abierto con Show().

    • Tengo el mismo problema, pero yo voy a abrir con un ShowDialog…
    • creo que IsCancel o propiedad IsDefault la causa de este problema.
    • En mi caso, yo era la configuración de DialogResult = false; como la inicialización, y después de la prueba de la lógica, me puse DialogResult = true;. Ese fue el origen del problema. que no conjunto de DialogResult dos veces! además, DialogResult=true; DialogResult=true; plantea la excepción así 🙂
    • Inadvertidamente configuración DialogResult dos veces fue el problema para mí también.
  2. 16

    Me encontré con este problema cuando he creado una ventana, a la que se llamó a través de ShowDialog(). En la ventana, había un Ok_Clicked que incluía una serie de declaraciones. Con el fin de ‘garantizar’ el cuadro de diálogo devuelve false si hubo nada malo yo primero se inicializa el DialogResult a false. Si todo estaba bien, me, a continuación, establezca DialogResult a la verdadera y cerró la ventana. Yo seguía recibiendo la misma excepción.

    Me enteré de que si el DialogResult no fue establecida a true, ShowDialog siempre devolverá false. Cuando me he quitado DialogResult = false en el comienzo de la Ok_Clicked, yo ya no tengo la excepción.

  3. 9

    Me llegó a través de una alternativa de respuesta que puede ayudar a otros. Me terminó de llamar a Close() en la ventana antes de establecer la DialogResult. Asegúrese de no hacerlo, serán la causa de este error.

  4. 6

    Para aquellos que utilizan ShowDialog puede quitar propiedades de un botón:

    IsCancel=true
    y
    IsDefault=true

    • Pero, a continuación, la fuga y la Intro, no se activará el cancelar o botón predeterminado como sus usuarios probablemente sería de esperar que ellos.
  5. 1

    Usted está tratando de crear Window.DialogResult demasiado pronto debido a la unión. Presumiblemente su DialogCloser.DialogResult (que no se nos muestra) la aplicación también se establece DialogResult en Window. Intente cambiar el modo de enlace a OneWayToSource de modo que los cambios sólo se propaguen a su VM y no al revés:

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

    O tal vez es sólo una cuestión de cambiar su comportamiento para establecer sólo Window.DialogResult si el Window se ha mostrado como un cuadro de diálogo. Difícil de decir sin ver todo.

    • Nope! He intentado eso, pero no trabajo aquí. Este error sólo se produce cuando hago clic en el botón cerrar.
    • Era la ventana que actualmente se muestra como un cuadro de diálogo? es decir. ShowDialog() no Show()
    • Yo no mostrar la implementación de DialogCloser.DialogResult porque su mencionados en este enlace del blog que he mencionado anteriormente también: blog.excastle.com/2010/07/25/…
    • Boogart: estoy llamando al formulario de la Aplicación.xaml StatupUri
    • Kent me dio la sugerencia de ShowDialog/Mostrar la diferencia que me ayude a solucionar el problema. He cambiado la implementación de la DialogCloser ahora utilizar la ventana.close(); y no se establece la DialogResult. Parece StartupUri de aplicación llama a Mostrar() y que no se puede establecer DialogResult si Mostrar() es llamado.
    • Si corregir la respuesta que puedo aceptar tu respuesta Kent! Gracias de todos modos

  6. 0

    Me encontré con el mismo problema, el uso de ShowDialog() y ajuste el resultado antes de llamar a cerrar.

    Lo que hice fue, sin embargo, ocultar el cuadro de diálogo antes de establecer el resultado.
    Así, cuando la creación de DialogResult la Visibilidad tiene que ser Visibles, tanto Ocultos y se Derrumbó le dará el error engañoso que «DialogResult sólo se puede establecer después de la Ventana que se crea y se muestra como diálogo.».

  7. 0

    Para mí, como Jarvis, este error fue causado por la configuración de DialogResult después de llamar a Close() para una ventana que se muestra a través de ShowDialog().

    En mi caso, creo que fue porque me estaba portando código de WinForms para WPF. El orden en que se trabajó muy bien en WinForms, pero WPF no le gusta.

    He intentado otras soluciones, como la eliminación de la isDefault y isCancel atributos de los botones de mi, pero esos no tuvo ningún efecto.

  8. 0

    Sé que este hilo es ya bastante viejo, pero hoy me he topado con el mismo problema. Lo que yo estaba haciendo mal es que he abierto una nueva Ventana con ShowDialog() que he cerrado la Ventana nueva con Close() y trató de establecer el DialogResult a la Verdad.

    Pero su ya de por sí suficiente si sólo se establece la DialogResult a True y después de que la Ventana se cerrará automáticamente y no hay necesidad de llamar a la Close() método.

  9. 0

    Estaba recibiendo este error y resuelto por la configuración de la DialogResult antes que cualquier otro código en el controlador de eventos click. Cuando estaba en el final, justo antes de Cerrar, me gustaría obtener el error. Pero con él al principio, funciona. Espero que esto ayude a alguien, que me volvió loco antes de que finalmente consiguió trabajo.

Dejar respuesta

Please enter your comment!
Please enter your name here