MVP und Übergabe von CancelEventArgs

Ich schreibe ein einfaches Eingabeformular mit Model-View-Presenter, und ich habe Schwierigkeiten bei der Handhabung des FormClosing-Ereignisses festgestellt.

Wenn es sich um ein normales Formular handelt, wird beim Schließen ein Ereignis ausgelöst, das FormClosing aufgerufen wird, mit dem ich das Schließen abbrechen kann, wenn ich es für notwendig erachte. In diesem Fall möchte ich das Schließen des Formulars abbrechen, wenn die Eingabe fehlerhaft ist. Zum Beispiel:

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;
  }
}

Ich habe meinen eigenen Ereignishandler ( Closing ) erstellt, weil mein Verständnis von MVP besagt, dass die Verwendung von irgendetwas in System.Windows.Forms keine gute Idee ist (zB wenn ich eines Tages meine Blick auf WPF). Daher übermittle ich das Ereignis in der WinForms-Implementierung als solches:

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));
  }
}

Ich habe festgestellt, dass obwohl ich in meinem Presenter e.Cancel sage, dass er auf "true" gesetzt wird, wenn die Validierung fehlschlägt, nicht dazu führt, dass das Formular den Abschluss abbricht. Ich mache hier offensichtlich etwas falsch, aber ich bin mir nicht sicher, was die richtige Lösung ist.

0
Ich zog CancelEventArgs aus dem System.ComponentModel Namespace .
hinzugefügt der Autor Arclight, Quelle
Also wo hast du den CancelEventArgs implementiert? und woher kam view_Closing , um den Konstruktor des Presenters zu erstellen?
hinzugefügt der Autor huMpty duMpty, Quelle