2012-02-16 1 views
1

현재 프리즘을 배우는 중입니다. 나는 테스트 애플리케이션을 구축 중이며 버튼 클릭시 뷰를 영역에 주입해야한다. 보기 모델에서이 코드를 사용하여 수행하는 방법을 알고 있습니다.프리즘 4에서 주입보기 및 종속성 피하기

IRegion region = _regionManager.Regions[RegionNames.TicketEditorRegion]; 
TicketEditorView view = _componentContainer.Resolve<TicketEditorView>(); 
region.Add(view); 

문제는 모듈간에 참조를 추가해야한다는 것입니다. 나는 이것이 바람직하지 않다고 생각한다. 일부 RegionBuilderThing에 대한 인터페이스를 추가하고 view-model 내부에서이를 단일화하여 해결할 수 있습니다.

그렇다면이 접근법은 좋은 방법이며, 그렇다면이 RegionBuilderThing의 이름을 지정하는 방법 (일부 디자인 패턴/지침 또는 다른 사람들이 이해할 수 있도록하는 방법을 따르는 방법)은 무엇입니까? 이것이 좋은 접근 방법이 아니라면 무엇입니까?

+0

참고 * 어딘가에 *를 추가해야합니다. 당신이 'ITicketEditorView'를 가지고있다하더라도 컨테이너에게 구체적인'TicketEditorView'를 해결하도록 지시 할 필요가 있습니다. 그 시점에서 참조가 필요할 것입니다. – Jon

+0

예, 그렇지만 모든 모듈에 대한 참조가있는 인프라 프로젝트가 있습니다 (일반적인 유형에 사용됨). – mersadk

답변

0

삽입 할 ViewModel이 포함 된 외부 모듈에서 특정 EventAggregator 이벤트 (예 : InjectChildEvent)를 구독하는 클래스를 만들고이를 ComponentContainer에 싱글 톤으로로드합니다. InjectChildEvent는 RegionName을 매개 변수로 취할 수 있습니다. 구독 메서드에서 ViewModel을 해석하고이를 Region에 삽입합니다.

주 모듈에서 단추를 클릭하면 InjectChildEvent EventAggregator 이벤트의 인스턴스를 게시하십시오.

이렇게하면 다른 모듈에 대한 참조가 필요하지 않게됩니다. 인프라 프로젝트에서 EventAggregator 이벤트를 만들어야합니다.

+0

이것이 mvvm/prism 응용 프로그램에서 Controller라고 불리는 것을 발견했습니다. 더 자세한 정보는 http://www.developmentalmadness.com/archive/2009/10/15/mvvm-with-prism-101-ndash-part-3b-view-injection-and.aspx에서 찾을 수 있습니다. – mersadk

1

이상적으로는 View가 아닌 ​​IRegion의 Views 컬렉션에 ViewModel을 주입하는 것이 가장 좋습니다. 로드 된 ResourceDictionary에 DataTemplate이 있으면 (App.xaml도 마찬가지 임) ViewModel이 적절한 View로 렌더링됩니다. 그런 식으로 ViewModel 코드를 화면에서 렌더링하는 데 사용되는 View에 대한 지식으로부터 완전히 분리 할 수 ​​있습니다.

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}"> 
    <views:MyView /> 
</DataTemplate> 

그렇다고해서 나는 그런 생각을하지 않고도 RegionBuilder가 필요하다고 생각하지 않습니다.

+0

좋습니다. 그래도 여전히 모듈 프로젝트에있는 뷰 모델에 대한 참조가 필요합니다 (피할 수있는 참조). – mersadk

+0

다른 모듈에 대한 참조를 피하는 것이 확실하다면 다른 대답을 추가했습니다. –