2009-11-14 4 views
4

MVVM을 시작하기 시작했습니다. 나는 현재 Cinch 프레임 워크를 실험 중이지만, 아직까지는 그렇게하지 않을 것입니다.
뷰의 코드 숨김에 ViewModel에 대한 참조를 사용하여 뷰에 ViewModels을 주입하고있었습니다 (속성에 [종속성]이 있음). setter에서 DataContext를 오른쪽 뷰로 설정합니다. 단일성. 깔끔한 트릭, 나는 생각했다.XAML의보기를 해결하기 위해 Unity를 얻는 것

삽입 된 뷰가있는 단일 창으로 작업하도록 응용 프로그램을 만들려고합니다. (여러 창과 반대로 \ 닫는 것과 반대입니다.) Windows에서 UserControls로 내 뷰를 변경하고 a를 메인 윈도우. 그 효과가 있었지만 ViewModel이 삽입되지 않았습니다. 아마도 XAML이보기를 만들 때 Container.Resolve를 사용하지 않았기 때문입니다.보기를 만든 다음 Resolve를 사용하여 코드 숨김에 수동으로 추가했을 때처럼 [의존성]은 만들어진.

어떻게하면 XAML을 통해 뷰를 추가하거나 뷰를 UI 동작의 결과로 변경하면 Unity를 통해 뷰를 추가하여 마법을 사용할 수 있도록 할 수 있습니까?

답변

3

당신의 문제를 해결하는 방법은 윈도우에 ViewModel을 갖도록하는 것입니다. UserControls의 ViewModels을 속성으로 드러내는 것입니다. 그런 다음 XAML에서 Binding 메커니즘을 사용하여 UserControl의 DataContext를 기본 ViewModel의 적절한 속성에 바인딩하면됩니다. 그리고 그 주 ViewModel은 Unity 컨테이너에서 해결 되었기 때문에 필요에 따라 다른 ViewModel을 모두 주입하게됩니다.

+0

감사합니다. 지금 사용해 보겠습니다. ViewModel 클래스를 UserControl의 내용으로 넣으면 나에게 혼란 스럽습니다.; D : DataTemplate에 적절한보기를 적용하여 표시합니다. – Kage

4

이 문제는 일반적으로 영역 및 RegionManager를 사용하여 해결됩니다. 메인 윈도우 ViewModel에서 일련의 영역이 생성되어 RegionManager에 추가됩니다. 그런 다음 ViewModels를 해결하고 Region.Views 컬렉션에 추가 할 수 있습니다.

XAML에서 Region은 주 ViewModel의 Region 속성에 바운드 된 ItemsControl의 ItemsSource 속성을 가짐으로써 정상적으로 주입됩니다.

public class TestScreenViewModel 
{ 
    public const string MainRegionKey = "TestScreenViewModel.MainRegion"; 

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager) 
    { 
     this.MainRegion = new Region(); 
     regionManager.Regions.Add(MainRegionKey, this.MainRegion); 
    } 

    public Region MainRegion { get; set; } 
} 

이것은 당신의 IModule

 #region IModule Members 

    public void Initialize() 
    { 
     RegisterViewsAndServices(); 

     var vm = Container.Resolve<SelectorViewModel>(); 
     var mainScreen = Container.Resolve<TestScreenViewModel>(); 
     mainScreen.MainRegion.Add(vm); 

     var mainView = ContentManager.AddContentView("Test harness", mainScreen); 
    } 

    #endregion 

정상적으로 해결 된 것 그리고 뭔가를 찾고 템플릿의 XAML 표현 :

그래서, 메인 화면의 뷰 모델에서이 같은 것을 할 것이다

<DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}"> 
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"> 
     <StackPanel> 
      <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" /> 
     </StackPanel> 
    </ScrollViewer> 
</DataTemplate> 
관련 문제