我试图在的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();
    }
}
有帮助吗?

解决方案

您可以看一下事件聚合模式。它可以让你把一切都松耦合。棱镜自带之一,它是很容易使用,而无需购买到整个棱镜框架/库。

然后,您的代码可能看起来是这样的:

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

编辑:布赖恩诺伊斯已经移植了棱镜事件聚合器的WinForms。检查出来这里,在他的博客

其他提示

在构造函数中考虑其他儿童的观点似乎是一个坏主意。你会怎么做,如果一个孩子视图需要在将来增加?

这将是更好,如果你的路线,通过父视图你的孩子的事件。你是如何违反了MVP,如果你的路线,通过父视图的事件?

我想创建一个名为SiblingView(或更合适些给你的应用程序的业务环境)的IChildView接口的属性。您甚至不必将其添加为在构造函数中设置了一个param,但有接口包括一个名为SetSiblingView()方法。你可以从你的构造函数中调用它。然后,您可以有一个事件OnSiblingEventFired()。

在我看来不太令人费解,但也许一般那只是因为多数民众赞成我是如何在过去走近这个类型的问题。

但我同意,在不知道具有父控制太多细节似乎不是MVC模式以下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top