2010-03-31 4 views
0

현재 Silverlight 4 용 최신 프리즘을 사용하여 응용 프로그램을 구축 중입니다. 모듈이 있고 그 모듈에서 뷰 모델과 두 가지보기가 있습니다. 또한 각보기에 대해 두 개의 영역이있는 모듈보기가 있습니다. 모듈 초기화에서 유니티 컨테이너에 내 뷰와 뷰 모델을 등록하고 뷰를 해당 영역으로 등록합니다. 문제는 뷰가 테이블 상세 정보와 비슷한 것을 표시해야한다는 것입니다. 첫 번째 뷰는 사용 가능한 엔티티를 표시하고 두 번째 뷰는 선택한 엔티티의 세부 사항을 표시합니다.영구 가입자 동작이있는 WPF/SL EventAggregator 구현?

내가 처음 선택한 엔티티를 전달하는 방법이 필요합니다. 새로 생성 된 첫 번째 뷰에는 선택한 엔티티가없고 새로 만든 두 번째 뷰에는 세부 정보가 표시되지 않습니다.

현재이 방법을 사용하고 있습니다. 모듈에서 두 개의 뷰 모델을 만들고 유니티 컨테이너에 인스턴스로 등록한 다음 뷰를 해당 영역의 유형으로 등록합니다. 각 뷰는 EventAggregator에서 EntitySelectedEvent를 구독합니다. 모듈 이니셜 라이저는 초기화 후이 이벤트를 게시하여 두 가지보기가 동일한 엔티티를 선택합니다.

내가보기에는 못 생겼어.보기 모델 중 하나에서이 이벤트를 게시하려고했지만 문제는 프리즘의 EventAggregator가 영구 가입자를 지원하지 않는다는 것입니다. 즉, 두 번째보기 모델이 이벤트에 가입하지 않은 경우 첫 번째 뷰 모델이 그것을 실행하면 수신 및 이벤트가 발생하지 않습니다. 나는 이것이 EventAggregator의 정상적인 동작이라는 것을 알고 있지만, 뷰 모델이 이벤트의 초기화 순서에 의존하지 않고 이벤트를 발생시킬 수있는 솔루션을 찾고 있습니다. 즉, 첫 번째 모델은 두 번째 모델이 생성되기 전에 이벤트를 발생시킬 수 있고 두 번째 모델은 두 번째 모델입니다. 그것을 구독하면이 '대기열에 넣어 진'이벤트를 받게됩니다.

이러한 동작을 지원하거나 중재자 (예 : 모듈 자체)를 사용하는 WPF/SL 용 메시징 구현은 그다지 좋지 않습니까? 중재자의 한 가지 큰 문제는 모델을 초기화 할 때 즉시 생성해야하며 누락 된 구독자가 다시 발생하기 때문에 컨테이너에 유형으로 등록 할 수 없다는 것입니다.

답변

0

각보기의 ViewModels에서 공유 할 모델을 만듭니다.

뷰 1에서 행이 선택되면 뷰의 ViewModel이 선택된 행에 바인딩 된 CurrentEntity 속성을 통해 모델을 업데이트합니다.

View 2의 ViewModel은 Model의 CurrentEntity 변경 사항을 구독하고 View가 업데이트되도록하는 CurrentEntity 속성을 올바르게 업데이트합니다.

+0

감사합니다. 그러나 필자는 뷰 관련 로직이 새어 나가는 것을 원하지 않습니다. 나는 뷰 모델에서 로직을 선택하고 이벤트 기반 메시징을 중계하지 않는다. (적어도 이것이 유일한 해결책이다.) 문제는 뷰 모델을 특별한 순서로 만들어야한다는 것이다. 뷰 모델 중 하나가 이벤트를 게시하거나 뷰 모델이 생성되었음을 알게 된 후 이벤트를 발생시키는 조정자를 사용하는 경우 (모듈 인 중재자가 정확하게 이것을 수행하고 있음). – sha1dy

+0

글쎄, 필자는 프리즘의 이벤트가 모듈 간 통신에 사용되어야한다고 주장한다. 예 : 모듈 A의 VM은 모듈 B의 VM-S에 대해 아무것도 모르기 때문에 관심이 없으므로 somone에 흥미로운 이벤트를 발생 시켰습니다. 그러나 두 VM이 같은 모듈에 있고, 특히 그 기능이 너무 명확하게 결합되어 있다면, 왜 그들이 서로에 대해 알지 못하게합니까? 부모 VM은 아이에게 바로 주입 할 수 있습니다. 대신 이벤트를 사용하여 불필요한 복잡성을 유발하지 않습니까? –

+0

어쩌면 당신 말이 맞을 것입니다. 그들은 실제로 하나의 모듈 안에 있고 하나의 뷰 모듈은 다른 모듈을 제어합니다. 나는 당신의 제안에 대해 생각할 것입니다. – sha1dy

관련 문제