2017-04-18 10 views
1

MVVM 기반 WPF 데스크톱 응용 프로그램이 있습니다. MVVMLight와 Prism을 사용하여 뷰와 하위 뷰가 포함 된 사용자 컨트롤을 만듭니다.MVVM WPF 응용 프로그램에서 자식 뷰 이벤트의 부모 뷰를 어떻게 알릴 수 있습니까?

하위보기에 단추가 있습니다. (닫기 버튼이라고 가정)

중첩 된 하위 뷰에서 상위 뷰를 포함하는 클릭 이벤트 알림을 전파하는 가장 좋은 방법은 무엇입니까?

+0

프리즘 이벤트 수집기를 살펴보십시오. http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/#event-aggregation –

답변

0

프리즘 EventAggregator 포함

당신이 TPayload 당신이 당신의 닫기 버튼이 당신의 하위 뷰에서 (int, string, or even class object)

2를 전달하는 타입이다

public class CloseTabEvent : PubSubEvent<TPayload> 
    { 

    } 

게시 할 1. 만들기 이벤트 게시 그 사건. 닫기 버튼 Command (메소드 실행)에서 해당 이벤트를 퍼블리시합니다. 당신의 서브 뷰 생성자에서

private void OnCloseExecuted(object obj) 
{ 
_eventAggregator.GetEvent<CloseTabEvent>().Publish(SomethingThatYouPublis..ThisIsTPayload); 
} 

IEventAggregator을 통과하고 개인 필드를 확인합니다. 당신의 mainViewModel에서

3.

private IEventAggregator _eventAggregator; 
public SubViewModel(IEventAggregator eventAggregator) 
{ 
_eventAggregator = eventAggregator; 
} 

당신은 또한 IEventAggregator을 통과 생성자 내부에 가입.

public MainViewModel((IEventAggregator eventAggregator) 
{ 
    eventAggregator.GetEvent<CloseTabEvent> 
    ().Subscribe(MethodForClosingThatSpecificTab); 
} 

그리고 그게 전부입니다.

중요 : 일부 IoC (Unity, Autofac ..)를 사용하여 IEventAggregator을 해결하면 싱글 톤이되므로 전체 앱용입니다.

1

하위보기는 부모보기 (또는보기 모델)가 구독하는 메시지를 보내려면 MshvmLight의 Messenger 클래스 또는 을 프리즘에 사용할 수 있습니다. 개념에 대한 자세한 내용은 다음 링크를 참조하십시오.

https://msdn.microsoft.com/en-us/magazine/jj694937.aspx http://dotnetpattern.com/mvvm-light-messenger https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

또 다른 방법은 부모 뷰 모델에서 아이 뷰 모델에 대한 강한 참조를 유지하고 부모가 구독 아동에 이벤트를 발생하는 것입니다.

이벤트 수집기 또는 메신저를 사용하면 이벤트 게시자와 구독자간에 긴밀한 연결을 피할 수 있으므로 응용 프로그램을보다 쉽게 ​​유지 관리해야하는 이점이 있습니다.

이벤트 또는 메시지의 게시자와 구독자 모두 이벤트 수집기 또는 메신저에 대해서만 알고 있지만 서로에 대해 아무것도 모릅니다.