In un'app .NET di Windows Form con un MVC personalizzato, un UserControl personalizzato (vista) può implementare una logica non animata da sola?

1

Questo è strongmente legato a queste due domande:

link

Il controller dovrebbe sapere su Visualizza & Modello? o viceversa?

così come questo:

link

In particolare, una parte di questa risposta alla terza, menzionando il modo in cui Windows Forms / UserControl la classe stava creando un'istanza della classe dati, mi ha fatto riflettere su questo:

Quando si crea un'app di Windows Form con un'architettura MVC (non il framework MVC incorporato di Microsoft), una classe Windows Form / UserControl può sapere o fare qualsiasi cosa em> tranne fondamentalmente si disegna da solo? Ad esempio, mi vengono in mente due casi specifici:

  1. Una classe dati viene passata in entrambe le direzioni tra la vista e il controller per organizzare le cose e per semplificare cose come le interfacce dei metodi.

  2. Quando, per esempio, viene fatto clic sul pulsante nel modulo, il controller deve gestire tutti questi tipi di eventi direttamente nei propri listener di eventi? Se i listener di eventi interni alla vista richiamano semplicemente le callback impostate dal controller e quindi non fanno altro? (Se entrambi, mi sto appoggiando al controller che gestisce gli eventi.)

Questa è una domanda di carattere generale sul fatto che la vista debba fare qualsiasi cosa di propria iniziativa una volta che viene istanziata, eccetto che si presenta all'utente, ma i due casi sopra esemplificano perché non sono abbastanza in grado di prendere il consiglio dato dalle domande precedenti e segui completamente come applicarlo a questa domanda.

Aggiorna

Questa risposta a una domanda più recente è strongmente correlata al primo punto.

    
posta Panzercrisis 26.04.2016 - 23:36
fonte

1 risposta

2

Come ha commentato Robert Harvey, MVP (model-view-presenter) è il modello architettonico scelto da Winforms. MVP è davvero solo un sapore di MVC però.

Il tuo modulo (vista) dovrebbe implementare un'interfaccia che definisca l'API pubblica della vista.

FooForm : IFooView, Form

E esporrà alcuni dei suoi elementi tramite proprietà, ad esempio forse un input da casella di testo.

public string FirstName
{
    get { return txtFirstName.Text; }
    set { txtFirstName.Text = value; }
}

Quindi, come hai detto, il controller (Presenter) ascolterà per qualsiasi evento.

public event EventHandler Submit;

private btnSubmit_Click(EventArgs e)
{
    Submit?.Invoke(e);
}

In altre parole, mantieni il tuo punto di vista il più semplice possibile. Il solo compito è legare i dati agli elementi del modulo e generare eventi. Il tuo controller (Presenter) è responsabile della vera logica.

Il tuo punto d'ingresso% rootProgram.cs sarà simile a questo.

[STAThread]
static void Main()
{
    var view = new FooForm();
    var presenter = new FooPresenter((IFooView)view);

    Application.Run(view);
}
    
risposta data 27.04.2016 - 01:59
fonte

Leggi altre domande sui tag