MVP y pasando CancelEventArgs

Estoy escribiendo un formulario de entrada simple usando Model-View-Presenter, y he tenido dificultades para manejar el evento FormClosing.

Cuando se trata de un Formulario normal, tiene un evento que se activa al cierre llamado FormClosing que puedo usar para cancelar el cierre si lo considero necesario. En este caso, me gustaría cancelar el formulario cerrar si la entrada es incorrecta. Por ejemplo:

public interface IView
{
  event EventHandler Closing;

  string Input { get; set; }
  string ErrorMessage { set; }
}

public class Presenter
{
  private IView view;

  public Presenter(IView view)
  {
    this.view = view;

   //bind to events
    view.Closing += view_Closing;
  }

  private void view_Closing(object sender, CancelEventArgs e)
  {
    e.Cancel = !ValidateInput();
  }

  private bool ValidateInput()
  {
    bool validationSuccessful = true;

   //perform validation on input, set false if validation fails
    return validationSuccessful;
  }
}

Creé mi propio controlador de eventos ( Closing ) porque mi comprensión de MVP indica que utilizar cualquier cosa en System.Windows.Forms no es una buena idea (por ejemplo, si algún día actualizo mi ver a WPF). Por lo tanto, en la implementación de WinForms, paso el evento hacia adelante, como tal:

public partial class View : IView
{
  public event EventHandler Closing;

  public string Input { get { return textBoxInput.Text; } set { textBoxInput.Text = value; } }
  public string ErrorMessage { set { errorProvider.SetError(textBoxInput, value) ; } }

  public View()
  {
    InitializeComponent();
  }

  private void View_FormClosing(object sender, FormClosingEventArgs e)
  {
    if (Closing != null)
      Closing(this, new CancelEventArgs(e.Cancel));
  }
}

Descubrí que aunque en mi Presenter le digo a e.Cancel que se configure como verdadero cuando la validación falla, no causa que el formulario cancele el cierre. Claramente estoy haciendo algo mal aquí, pero no estoy seguro de cuál es la solución adecuada.

0
Saqué CancelEventArgs del System.ComponentModel namespace .
agregado el autor Arclight, fuente
Entonces, ¿dónde has implementado el CancelEventArgs ? y ¿de dónde vino view_Closing del constructor presentador?
agregado el autor huMpty duMpty, fuente

1 Respuestas

Lo descubrí después de experimentar con la solución en otra pregunta de StackOverflow . Necesitaba crear un nuevo CancelEventArgs en la Ver de la siguiente manera:

private void View_FormClosing(object sender, FormClosingEventArgs e)
{
  CancelEventArgs args = new CancelEventArgs();

  if (Closing != null)
    Closing(this, args);

  e.Cancel = args.Cancel;
}

args.Cancel properly updated after the Closing event was called, and successfully mapped the resultant boolean to e.Cancel.

0
agregado