Domanda

Sto tentando di utilizzare MVP in WinForms e sono confuso su come gestire al meglio il coordinamento tra le visualizzazioni figlio.

Ad esempio, ho una vista padre che ha due viste figlio. Gli eventi in una vista figlio devono causare un'azione da parte della seconda vista figlio.

La vista padre dovrebbe controllarlo direttamente? Mi sembra di ignorare il modello MVP facendo questo.

O le viste figlio devono essere considerate reciprocamente come parametri del costruttore? In tal caso, quando un evento veniva generato dalla prima vista figlio, la seconda vista figlio riceveva l'evento e quindi avvisava il relatore che si era verificato qualcosa? Il relatore deve quindi ottenere i dati dalla prima vista figlio (di cui non è nemmeno a conoscenza) per dire alla seconda vista figlio cosa fare. Sembra contorto, quindi mi sento come se mi mancasse qualcosa.

Ecco alcuni pseudo-codici per la situazione:

public class ParentView : UserControl, IParentView
{
    private ChildViewOne childViewOne;
    private ChildViewTwo childViewTwo;
    private ParentViewPresenter presenter;

    private RegisterEvents()
    {
        childViewOne.EventOccured += new EventHandler(HandleEvent);
    }

    private void HandleEvent()
    {
        childViewTwo.DoSomething();
    }
}
È stato utile?

Soluzione

Puoi guardare il Pattern Aggregator di eventi . Ti permetterà di tenere tutto accoppiato in modo lasco. Prism ne viene fornito uno ed è abbastanza facile da usare senza dover acquistare l'intero framework / libreria Prism.

Il tuo codice potrebbe quindi apparire così:

public class ChildViewOne {
    private IEventAggregator evtAggregator;

    public ChildViewOne(IEventAggregator evtAggregator) {
        this.evtAggregator = evtAggregator;
    }

    private void OnEventOccured(){
        evtAggregator.GetEvent<EventOccured>().Publish();
    }
}

publish class ChildViewTwo {
    private IEventAggregator evtAggregator;

    public ChildViewTwo(IEventAggregator evtAggregator) {
     evtAggregator.GetEvent<EventOccured>().Subscribe(OnEventOccured);
    }

    private void OnEventOccured() {
        // Do something here...
    }
}

EDIT: Brian Noyes ha portato l'aggregatore di eventi prisma su winforms. Dai un'occhiata qui, sul suo blog

Altri suggerimenti

Prendere altre visioni secondarie nel costruttore sembra una cattiva idea. Cosa farai se in futuro sarà necessario aggiungere un'altra vista figlio?

Sarebbe meglio se instradassi il tuo evento figlio attraverso la vista padre. Come stai violando il MVP se instradi i tuoi eventi attraverso la vista principale?

Vorrei creare una proprietà dell'interfaccia IChildView denominata SiblingView (o qualcosa di più appropriato dato il contesto aziendale della tua app). Non è nemmeno necessario aggiungerlo come parametro nel costruttore, ma l'interfaccia deve includere un metodo chiamato SetSiblingView (). Potresti chiamarlo dal costruttore. È quindi possibile avere un evento OnSiblingEventFired ().

Mi sembra meno contorto, ma forse è solo perché in genere ho affrontato questo tipo di problema in passato.

Ma sono d'accordo, senza conoscere troppi dettagli con il controllo parent non sembra seguire il modello MVC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top