2011-02-23 3 views
0

최근 실버 라이트에서 프리즘으로 작업하기 시작했습니다. EventAggregator를 사용하여 두 ViewModel간에 이벤트를 구독하고 게시하고 싶습니다. 일부 가이드에서 보았 듯이 ViewModel의 ctor는 IEventAggregator를 매개 변수로 받아 들여야합니다. 이 때문에 어떻게 내 View 항상 매개 변수가없는 ctor ViewModel 초기화하려면 어떻게하는지 찾을 수 없습니다.프리즘 MVVM - IEventAggregator를 내 ViewModel에 전달하는 방법

내 뷰 모델의 ctor에 :

MyViewModel(IEventAggregator eventAggregator) 
{ 
    // get the event.... 
} 

내보기 :

<UserControl ....> 

    <UserControl.Resources> 
     <ViewModels:MyViewModel x:Key="MyViewModel"/> 
    </UserControl.Resources> 

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyViewModel}}"> 
    .... 
    <Grid/> 

</UserControl> 

내가보기의 ctor에의 뷰 모델을 인스턴스화하고 그것의 DataContext에 할당,하지만 내가 있어야 할 수 있습니다 내보기에있는 IEventAggregator도 얻을 수 없습니다. 하지만 이것은 아마도 IEventAggregator (또는 다른 객체! - 예를 들어 IUnityContainer)를 ViewModel에 전달하는 올바른 방법이 아닙니다.

누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?

답변

2

당신은 화합을 통해 당신의 의존성을 해결해야합니다. 프리즘 MVVM 예제와 UI 구성을 살펴보십시오. 뷰는 뷰 모델을 만들지 않지만 정확히 다른 방향입니다. 뷰 모델은 생성자 삽입을 통해 뷰를 주입합니다. 당신이보기 모델과 화합 뷰를 등록해야이 방법을 사용

public interface IView 
{ 
    IViewModel ViewModel{get;set;} 
} 

public interface IViewModel { } 

public View:UserControl, IView 
{ 
    public IViewModel ViewModel 
    { 
     get{return DataContext as IViewModel;} 
     set{DataContext = value;} 
    } 
} 

public ViewModel:IViewModel 
{ 
    public ViewModel(IView view, IEventAggregator eventAggregator) 
    { 
     view.ViewModel = this; 
     //get the event... 
    } 
} 

: 뷰 모델은 뷰에 대한 뷰 모델로 자신을 설정합니다. 이후에는 뷰 모델 만 분석하면 뷰가 컨테이너에 의해 주입됩니다.

사용자 인터페이스에서 올바른 위치로보기를 얻으려면보기를 RegionManager를 사용하여 영역에 등록해야합니다. 이것이 모두 설정되면 새 뷰 모델 인스턴스를 작성하면 뷰가 등록 된 영역에 추가되어 사용자 인터페이스에 표시됩니다.

+0

올바른 방법입니다. – Maciek

+0

응답 해 주셔서 감사합니다. 뷰 모델을 어디에서 인스턴스화합니까? – leeran

+0

@ leeran88 : 답을 얻기 위해서는 더 많은 신청서가 필요합니다. 기본적으로이 시나리오에서는 뷰를 먼저 인스턴스화 한 다음 뷰 모델을 인스턴스화 한 다음 두 인스턴스와 결혼하게됩니다. 이 시나리오에서는 뷰가 IView 인터페이스도 구현해야합니다. –

1

보기의 데이터 컨텍스트에 ViewModel 후크 자체가있는 것 외에 (나는 전혀 마음에 들지 않습니다) Silverlight에서 생각할 수있는 두 가지 옵션이 있습니다.

  1. 정적 리소스가 컨테이너를 통해 스스로 만들 수 있도록 ServiceLocator 패턴을 활용하십시오. MVVMLight은이 패턴이 상당히 좋습니다.
  2. Caliburn.Micro과 같은 프레임 워크를 사용하면 바인딩 및 뷰 모델을 포함하여 명명 규칙을 기반으로 많은 것들을 연결하는 멋진 컨벤션 세트를 사용할 수 있습니다.
관련 문제