2011-03-28 2 views
3

MVVM을 사용하면서 이전에는 모든보기를 DataTemplate으로 만들었습니다. 해당보기 모델을 연결하기 위해 해당보기 모델이 있습니다. 방금 MVVM Light를 사용하기 시작했고 그들은 ViewModelLocator을 발견했습니다. 내가 본 몇몇 다른 툴킷에는이 변형이 포함되어 있지만 DataTemplate을 사용하면 어떤 이점이 있습니까?보기 모델을보기에 연결하는 가장 좋은 방법은 무엇입니까?

Views와 ViewModel을 연결하는 가장 좋은 방법은 무엇입니까?

+0

방금이 질문에 답변했습니다 (http://stackoverflow.com/questions/5462040/what-is-a-viewmodellocator-and-what-are-its-pros-cons-compared-to-datatemplates) :) – Jon

답변

6

.

ViewModelLocator 또는 유사한 것이 도움이되는 접근 방식은 MVVM을 개발하는 "처음부터보기"방식입니다. 이를 통해 디자이너에서 뷰로 시작한 다음 일치시킬 ViewModel을 빌드해야합니다. 논리적으로 뷰는 다른 뷰를 생성하는 경우가 많으며 일반적으로 ViewModel은 특정 형식의 로케이터를 통해로드되고 지정된 뷰에 대해 채워집니다. 메시징 또는 서비스는 새로 생성 된 ViewModels에 적절한 모델을 연결하는 데 사용됩니다.

특히 블렌드 작업을 할 때 시각적으로 디자인하기가 쉽습니다.

다른 접근법은 "ViewModel-First"를 사용하는 것입니다. 이를 통해 ViewModel을 생성 한 다음 DataTemplates를 사용하여 View를 채 웁니다. ViewModels는 적절한 VM을 직접 설정하여 다른 VM을 작성/작성합니다. 이것은 일반적으로 (IMO) 훨씬, 훨씬 더 프로그래머의 관점에서, 일을 그냥 직접 작동합니다. 그러나 디자인 타임 데이터를 생성하기가 더 어렵 기 때문에 일반적으로 설계자의 관점에서 설계하고 작업하기가 더 어렵습니다.

두 가지 방법 모두 완벽하게 유효하며 장점과 단점이 큽니다. 다른 MVVM purists는 여러 가지 이유로 한 가지 접근 방식을 선호하는 경향이 있습니다. 일반적으로 코드 정리 관점이나 디자이너 관점에서 접근합니다.

+0

+1 : 좋은 요약. – Jon

+0

+1 직접 응답. 나는 ViewModelLocator가가는 방법이라고 생각한다. (순수 주의자 대 순수 주의자 B라고 부른다.) 이를 통해 XAML에서 datacontext를 전송할 수 있습니다.이 컨트롤을 통해 컨트롤의 속성을 바인딩 할 수 있습니다. 이는 ViewModel에서 데이터 인터페이스를 설정할 때 추측하는 것보다 쉽습니다. – SQLMason

1

내가보기 :

  1. 당신은 모든 ViewModels에 대한 하나 개의 좋은 장소가 있습니다.
  2. MVVMLight가 제공하는 멋진 정리 메커니즘이 있습니다.
  3. 마크 업에서 ViewModel을 정적으로 연결할 수 있습니다. --- UI의 인스턴스를 생성하자마자 ViewModel이 인스턴스화되고 DataContext으로 설정된다는 사실을 인식하지 못하는 경우 가끔 문제가 될 수 있습니다.

를 들어 (3)합니다 (ViewModelLocator를 사용하는 방법) :

  1. 가 설치 한 조각을 가지고 있는지 확인하십시오.
  2. ViewModelLocator.cs을 열고 mvvmlocatorproperty을 입력하십시오. Intellisense에서 선택하고 스 니펫이 작동하도록 두 번 TAB하십시오. 적절한 속성으로 변경하십시오. 당신의 XAML에서
  3. 이처럼 사용합니다 :

    <Window.DataContext> 
        <Binding Path="HomePage" Source="{StaticResource Locator}"/> 
    </Window.DataContext> 
    

을이 속성 :

두 개의 서로 다른 접근 방식, 그리고 하나의 "올바른 방법"이있다
public HomePageViewModel HomePage 
    { 
     get 
     { 
      return HomePageStatic; 
     } 
    } 
관련 문제