2009-09-18 3 views
5

WinForms에서 MVP를 사용하려고 시도하고 있으며 하위 뷰 간의 조정을 가장 잘 처리하는 방법에 대해 혼란 스럽습니다.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(); 
    } 
} 
+0

"한 자식 뷰의 이벤트로 인해 두 번째 자식 뷰에서 작업을 수행해야합니다." 일어나는 행동은 정확히 무엇입니까? – SwDevMan81

+0

예를 들어 childViewOne이 타임 라인이고 childViewTwo가 비디오라고 가정합니다. 타임 라인은 TimeChanged 이벤트를 노출하며 비디오는 비디오의 현재 프레임을 변경하여 해당 이벤트에 응답해야합니다. – jameswelle

답변

0

Event Aggregator pattern을 볼 수 있습니다. 느슨하게 결합 된 모든 것을 유지할 수 있습니다. 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... 
    } 
} 

편집 : 브라이언 노이스는 윈폼에 프리즘 이벤트 애그리 게이터 (aggregator)를 이식했다. 그것을 확인하십시오 here, on his blog

0

생성자에서 다른 아이 뷰 촬영 : 여기

상황에 대한 몇 가지 의사 코드입니다. 나중에 다른 하위보기를 추가해야하는 경우 어떻게 할 것입니까?

상위 뷰를 통해 하위 이벤트를 라우팅하면 더 좋을 것입니다. 부모보기를 통해 이벤트를 라우팅하면 MVP를 어떻게 위반합니까?

+0

현재 진행 중이거나 ParentView가 모든 자녀 이벤트의 연합을 노출하고 이벤트를 발표자에게 전달한 것처럼 의미합니까? – jameswelle

0

나는 IChildView 인터페이스의 속성을 SiblingView (또는 귀하의 응용 프로그램의 비즈니스 컨텍스트에서 더 적절한)를 만들 것입니다. 생성자의 param으로 추가 할 필요조차 없지만 Interface에는 SetSiblingView()라는 메서드가 포함됩니다. 생성자에서 호출 할 수 있습니다. 그런 다음 OnSiblingEventFired() 이벤트를 가질 수 있습니다.

그것은 나에게 덜 복잡하게 보이지만 어쩌면 thats는 일반적으로 내가 과거에 이런 유형의 문제에 어떻게 접근했기 때문일 수 있습니다.

하지만 부모 컨트롤을 가지고있는 디테일이 너무 많아서 MVC 패턴을 따르지 않는 것 같아 동의합니다.

관련 문제