Pregunta

Estoy intentando usar MVP en WinForms y estoy confundido sobre cómo manejar mejor la coordinación entre las vistas secundarias.

Por ejemplo, tengo una vista principal que tiene dos vistas secundarias. Los eventos en una vista secundaria deben hacer que la segunda vista secundaria tome una acción.

¿Debería la vista principal controlar esto directamente? Parece que estoy evitando el patrón MVP al hacer esto.

¿O deberían las vistas secundarias tomarse entre sí como parámetros de constructor? En ese caso, cuando la primera vista secundaria activa un evento, la segunda vista secundaria recibe el evento y luego notifica a su presentador que algo ha ocurrido. El presentador necesita obtener los datos de la primera vista secundaria (que ni siquiera sabe) para decirle a la segunda vista secundaria qué hacer. Parece complicado, así que siento que me falta algo.

Aquí hay un pseudocódigo para la situación:

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();
    }
}
¿Fue útil?

Solución

Puede mirar el Patrón de agregador de eventos . Le permitirá mantener todo vagamente acoplado. Prism viene con uno y es bastante fácil de usar sin tener que comprar en todo el framework / biblioteca de Prism.

Su código podría verse así:

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

EDITAR: Brian Noyes ha portado el agregador de eventos de prisma a winforms. Compruébelo aquí, en su blog

Otros consejos

Tomar otras vistas secundarias en el constructor parece una mala idea. ¿Qué hará si necesita agregar otra vista secundaria en el futuro?

Sería mejor si enruta su evento secundario a través de la vista principal. ¿Cómo está violando el MVP si dirige sus eventos a través de la vista principal?

Crearía una propiedad de la interfaz IChildView llamada SiblingView (o algo más apropiado dado el contexto comercial de su aplicación). Ni siquiera tiene que agregarlo como parámetro en el constructor, sino que la interfaz incluya un método llamado SetSiblingView (). Podrías llamarlo desde el constructor. Entonces podría tener un evento OnSiblingEventFired ().

Parece menos complicado para mí, pero tal vez eso es solo porque así es como he abordado este tipo de problema en el pasado.

Pero estoy de acuerdo, sin conocer demasiados detalles teniendo el control principal, no parece estar siguiendo el patrón MVC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top