Pergunta

Eu estou tentando usar MVP em WinForms e estou confuso sobre a melhor forma de coordenação alça entre os pontos de vista da criança.

Por exemplo, eu tenho uma vista pai que tem dois pontos de vista da criança. Eventos sobre uma necessidade vista criança para causar uma ação a ser tomada pelo segundo ponto de vista da criança.

Caso a vista pai controlar isso diretamente? Parece que eu estou ignorando o padrão MVP, fazendo isso.

Ou devem os pontos de vista da criança tomar uns aos outros como parâmetros do construtor? Nesse caso, quando um evento foi disparado pela primeira visão da criança, o 2nd view criança receberia o evento e, em seguida, notificar a sua apresentador que algo tenha ocorrido? O apresentador, então, precisa obter os dados a partir da primeira vista criança (que nem sequer sabem sobre), a fim de contar a 2nd view criança o que fazer. Parece complicado, então eu sinto que estou perdendo algo.

Aqui estão algumas pseudo-código para a situação:

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

Solução

Você pode olhar para o Agregador Evento padrão . Ele permitirá que você para manter tudo de baixo acoplamento. Prism vem com um e é bastante fácil de usar, sem ter que comprar em todo Prism framework / biblioteca.

Seu código poderia então ter esta aparência:

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 portou o evento agregador prisma para winforms. Confira aqui, em seu blog

Outras dicas

Tomar outros pontos de vista da criança no construtor parece ser uma má idéia. O que você vai fazer se outra vista criança precisa ser adicionado no futuro?

Seria melhor se você rota seu evento criança através da vista principal. Como você está violando o MVP se você rota seus eventos através da vista pai?

Gostaria de criar uma propriedade da interface IChildView chamado SiblingView (ou algo mais apropriado, dado o contexto de negócios do seu aplicativo). Você não tem sequer a adicioná-lo como um parâmetro no construtor, mas tem a interface incluem um método chamado SetSiblingView (). Você poderia chamá-lo a partir do construtor. Você poderia, então, ter um evento OnSiblingEventFired ().

Parece menos complicado para mim, mas talvez isso é apenas porque isso é geralmente como eu têm abordado este tipo de problema no passado.

Mas eu concordo, sem saber muitos detalhes ter o controle pai não parece estar seguindo o padrão MVC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top