es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diálogo de mensaje se muestra dos veces en la aplicación WPF C# MVVM.

Estoy trabajando en una aplicación WPF (MVVM). Tengo un cuadro de diálogo de mensajes que estoy mostrando. Debería mostrarse solo una vez, pero se muestra dos veces. Este cuadro de diálogo está dentro de un método OnCanSaveExecute() que realiza algunas validaciones para habilitar un botón.

if (!_overUnderPayment)
{
    MessageDialogResult result = _messageDialogService.ShowOkCancelDialog("Aquí va el texto",
        "¿Continuar?");
    if (result == MessageDialogResult.OK)
    {
        _overUnderPayment = true;
        return true;
    }
    else
    {
        _overUnderPayment = true;
        return false;
    }
}

_overUnderPayment comienza como false. Como pueden ver, lo establezco como verdadero dentro de la lógica condicional.

_messageDialogService es…

public MessageDialogResult ShowOkCancelDialog(string text, string title)
{
    MessageBoxResult result = MessageBox.Show(text, title, MessageBoxButton.OKCancel, MessageBoxImage.Hand);
    return result == MessageBoxResult.OK
      ? MessageDialogResult.OK
      : MessageDialogResult.Cancel;
}

El código se ejecuta y el cuadro de diálogo se muestra correctamente. Puedo hacer clic en ‘Aceptar’ o ‘Cancelar’ y desaparece, luego se muestra de nuevo.

Depuré el código mediante puntos de interrupción y la primera vez que se ejecuta, lo hace exactamente como se diseño y llega a la declaración de retorno y finaliza el método.

Luego regresa a mi declaración if anterior (aunque _overUnderPayment es verdadero) y se vuelve a mostrar.

Quiero saber por qué se muestra dos veces, por favor.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basado en el código proporcionado, parece que el problema radica en el valor de _overUnderPayment. Mencionaste que comienza como falso, pero parece que no se está persistiendo en múltiples llamadas al método. Una posible explicación para esto es que el método OnCanSaveExecute() se está llamando varias veces antes de que se establezca la bandera _overUnderPayment en verdadero.

    Para solucionar esto, puedes considerar el uso de una variable estática en su lugar, la cual persistiría en múltiples llamadas a OnCanSaveExecute(). Por ejemplo:

    private static bool _overUnderPayment = false;
    
    public bool OnCanSaveExecute()
    {
        if (!_overUnderPayment)
        {
            // lógica del mensaje del diálogo aquí
    
            _overUnderPayment = true;
        }
    
        return _overUnderPayment;
    }
    

    Al hacer que _overUnderPayment sea estática, su valor se compartirá entre todas las instancias de la clase y persistirá en múltiples llamadas a OnCanSaveExecute().

Comments are closed.