Frage

Ich bin versucht, MVP in WinForms zu verwenden und bin verwirrt, wie man am besten Griff Koordination unter den Kinderblick.

Zum Beispiel habe ich eine übergeordnete Ansicht, die zwei Kinderblick. Veranstaltungen auf einer untergeordneten Ansicht benötigen eine Aktion zu veranlassen, durch das zweite Kind Blick genommen werden.

Sollte die übergeordnete Ansicht Kontrolle dieses direkt? Es scheint, wie ich das MVP-Muster am umgehen, indem Sie diese.

Oder sollte das Kind Blick nimmt sich als Konstruktorparameter? In diesem Fall, wenn ein Ereignis durch die erste Kind Ansicht gefeuert wurde, würde die zweite Kind Ansicht das Ereignis empfängt und dann seinen Moderator benachrichtigen, dass etwas stattgefunden hat? Der Moderator muss dann die Daten aus dem ersten Kind Blick bekommen (was es nicht einmal weiß), um das zweite Kind Blick zu sagen, was zu tun ist. Es scheint so gewunden ich, wie ich fühle bin etwas fehlt.

Hier finden Sie einige Pseudo-Code für die Situation:

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();
    }
}
War es hilfreich?

Lösung

Sie im Event-Aggregator Muster aussehen könnte. Es ermöglicht Ihnen, alles zu halten, lose gekoppelt. Prism kommt mit ein und es ist leicht genug, um ohne zu verwenden in die ganze Prism Rahmen / Bibliothek zu kaufen.

Der Code könnte dann wie folgt aussehen:

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 das Prisma Ereignis-Aggregator zu WinForms portiert. Check it out hier, auf seinem Blog

Andere Tipps

andere Kind Unter Ansichten in Konstruktor scheint wie eine schlechte Idee. Was werden Sie tun, wenn ein anderes Kind Blick in Zukunft hinzugefügt werden muss?

Es wäre besser, wenn Sie Route Ihr Kind Ereignis durch die übergeordnete Ansicht. Wie verletzen Sie die MVP, wenn Sie Route Ihre Veranstaltungen durch die übergeordnete Ansicht?

Ich würde eine Eigenschaft der IChildView Schnittstelle erstellen SiblingView (oder etwas mehr angemessen angesichts der geschäftlichen Kontext Ihrer Anwendung) genannt. Sie haben nicht einmal sie als param im Konstruktor hinzufügen müssen, haben aber den Schnittstellen umfassen eine Methode namens SetSiblingView (). Man könnte es aus dem Konstruktor aufrufen. Sie könnten dann ein Ereignis haben OnSiblingEventFired ().

Es scheint weniger gewunden zu mir, aber vielleicht das ist nur, weil das ist im Allgemeinen, wie ich diese Art von Problem in der Vergangenheit angesprochen habe.

Aber ich stimme, ohne zu sehr ins Detail zu wissen, das übergeordnete Steuerelement mit ihm nicht nach dem MVC-Muster zu sein scheint.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top