2010-03-09 4 views
1

나는 약간의 의지가 있기를 바라고 있습니다. 윈도우 (Window1) 및 페이지 (Page1)가 포함 된 wpf 응용 프로그램이 있습니다. 페이지는 프레임을 사용하여 창 안쪽에 있습니다.WPF 페이지에서 상위 창으로 값 전달

문자열 값을 메인 윈도우로 다시 전달하고 레이블 내에 표시 할 수있는 버튼이 페이지 내에 있습니다.

실마리가 없으므로 아무도 기본적인 예를 도울 수 있습니까?

답변

0

일반적으로 애플리케이션에서 일종의 게시자/구독자 패턴 이벤트 서비스가 필요한 것 같습니다. 이것은 외부 윈도우가 구독 할 수있는 Singleton 객체입니다.

EventService.Instance.AddListener("TheEventICareAbout" 
      , delegate(possiblySomeParameters) { 
       //Do Interesting Stuff Here. This code can access members of your 
       //window class or call methods on it to react to the event. 
       }) ; 

그런 다음 자녀 페이지 서비스에 대한 몇 가지 이벤트 올릴 수 :처럼이 서비스에 대한 일반 호출이 보일 수있는 내부

EventService.Instance.RaiseEvent("TheEventICareAbout" 
      , new EventParameters(possiblySomeParameters)) ; 

를, 서비스가 아마 이벤트 이름의 단지 사전이며, 프레임 워크 event s. AddListener은 이벤트 이름이 이미 존재하는지 확인하고, 그렇다면 event에 새 위임을 추가합니다. 그렇지 않은 경우 사전에 새 항목을 만들고 event에 새 대리자를 저장합니다.

대부분의 응용 프로그램 프레임 워크는 어떤 시점에서이 패턴을 사용하기 때문에 여러분이 직접 작성하고 싶지 않으면 많은 옵션이있을 것입니다. Prism Event Aggregator를 살펴보십시오. This is a short introduction이지만 기본 형식은 직접 작성하거나 기존 솔루션을 사용하는 경우에도 동일하게 유지됩니다.

이 접근법의 기본 이점은 느슨한 결합 및 확장 성입니다. 또한 ViewModel이 다른 ViewModel에 반응하는 이벤트를 발생시킬 수있는 MVVM 아키텍처에 적합합니다. 이를 통해 비즈니스 로직을보기에서 빼낼 수 있으며 더 완벽하게 테스트 할 수 있습니다.

"권장하지 않지만"빠르고 더러운 "솔루션의 또 다른 옵션은 페이지에 이벤트를 추가하고 Window에 처리기를 추가하게하는 것입니다. 그런 다음 페이지에서이 사용자 지정 이벤트를 발생시킬 수 있습니다. 여기서주의해야 할 사항은 가비지 콜렉션 (처리기를 제대로 제거하지 않으면 페이지가 GCed되지 않을 수 있음)과 페이지가 많지 않음을 보장하는 것입니다. 각 페이지는 약간 다른 이벤트를 발생시킵니다 .