如何在MVP中最好地处理儿童观点的协调?

jam*_*lle 5 c# model-view-controller mvp user-interface winforms

我试图在WinForms中使用MVP,并对如何最好地处理子视图之间的协调感到困惑.

例如,我有一个父视图,它有两个子视图.一个子视图上的事件需要导致第二个子视图执行操作.

父视图应该直接控制吗?这似乎是我绕过了MVP模式.

或者子视图是否应该将彼此作为构造函数参数?在这种情况下,当第一个子视图触发事件时,第二个子视图将收到该事件,然后通知其演示者发生了什么事情?然后,演示者需要从第一个子视图(它甚至不知道)获取数据,以便告诉第二个子视图要做什么.这似乎令人费解,所以我觉得我错过了一些东西.

这是针对这种情况的一些伪代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*pro 0

您可以查看事件聚合器模式。它将允许您保持一切松散耦合。Prism 附带了一个,并且使用起来非常简单,无需购买整个 Prism 框架/库。

您的代码可能如下所示:

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:Brian Noyes 已将 Prism 事件聚合器移植到 winforms。在他的博客上查看这里