2011-05-04 4 views
4

Unity를 사용하여 ViewModelLocator를 작성했으며이를 싱글 톤 ViewModel 인스턴스에서 성공적으로 사용했습니다. 예를 들어 :여러 인스턴스 ViewModels 및 ViewModelLocator

<Application.Resources> 
    <ResourceDictionary> 
     <VMS:ViewModelLocator x:Key="ViewModelLocator" d:IsDataSource="True"/> 
    </ResourceDictionary> 
</Application.Resources> 

다음과 같이 나를 뷰의의 뷰 모델에 결합 할 수 있습니다 :

public class ViewModelLocator 
{ 
    private static readonly UnityContainer Container; 

    static ViewModelLocator() 
    { 
     Container = new UnityContainer(); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      //Design Time Data Services 
      Container.RegisterType<IMyServiceServiceAgent, DesignMyServiceServiceAgent>(); 
     } 
     else 
     { 
      //Real Data Services 
      Container.RegisterType<IMyServiceServiceAgent, MyServiceServiceAgent>(); 
     } 

     Container.RegisterType<TreeViewViewModel>(new ContainerControlledLifetimeManager()); 
    } 

    public TreeViewModel ViewModel 
    { 
     get 
     { 
      return Container.Resolve<TreeViewModel>(); 
     } 
    } 
} 

ViewModelLocator는 App.xaml에 리소스로 정의된다

DataContext="{Binding TreeViewModel, Source={StaticResource ViewModelLocator}}" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=False}" 

내 질문은 동일한 패턴 (및 혼합 성)을 동일한 ViewModel의 여러 인스턴스와 어떻게 유지합니까?

이 게시물에서 내가 뭘하고 싶은지에 대한 참조를 찾았습니다. How to have multiple pairs "View-ViewModel"?하지만 구현의 구체적인 내용은 다루지 않습니다.

내가 할 수 있기를 원하는 것은 여러 데이터 트리에 대해 이러한 뷰/ViewModel 쌍의 인스턴스가 여러 개있어 복사 및 붙여 넣기가 가능하지만 컨테이너를 사용하여 ViewModelLocator의 특정 인스턴스를 어떻게 처리 할 것인지 생각할 수 없습니까?

내가 위에서 언급 한 게시물에 따라 일종의 ViewModels 콜렉션이 필요하다고 가정하고 있는데, 그 콜렉션을 Unity Container에 등록하려면 어떻게해야하고 어떻게 뷰에 바인딩 할 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

정말 좋은 질문입니다. 네가 한 것처럼 내가 붙어있어. 4 년이되었지만이 문제를 해결 했습니까? 아이디어가 있습니까? MVVM Light를 사용하고 있습니다. –

답변

0

귀하의 상황에서 내가 한 것은 뷰에 대한 단일 ViewModel을 유지하면서 변경할 수있는 다른 ViewModel을 가지는 것이 었습니다.

예를 들어 사용자 정보를 표시하는 UserView 컨트롤이있는 경우 ViewModelLocator를 통해 해당 뷰에 바인딩 된 단일 UserViewModel이 있습니다. 현재/편집중인 현재 사용자에 따라 변경할 수있는 UserModel 클래스가 있습니다. 이 UserModel 클래스는 ViewModelBase에서 상속되며 속성을 통해 UserViewModel 클래스에 의해 노출됩니다. 예를 들어 사용자가 선택된 경우 응용 프로그램의 다른 곳에서 UserViewModel의 User 속성을 UserView에 표시 할 UserModel로 설정합니다.

+0

흠, 단일보기에서 작동하는 것을 볼 수는 있지만 실제로 각보기가 특정 VM에 연결되어있는 View/ViewModel의 여러 인스턴스가 있어야합니다. 사실 나는 다른 정보 트리의 MDI를 만들고 그들 사이의 드래그 드롭을 허용하려고합니다. –