2013-06-18 4 views
2

부모 - 자식 모델 관계를 사용하는 MVVM의 모범 사례에 대해 몇 가지 의문점이 있습니다.MVVM - ViewModel/Model binding

특정 경우에는 그룹 및 연락처라는 두 가지 모델 (데이터 클래스)이 있습니다. 그룹에 연락처 목록이 포함되어 있습니다. 둘 다 INotifyPropertyChanged 인터페이스를 구현하고 있습니다.

뷰에는 DataTemplate을 사용하여 계층 구조를 표시하는 트리 뷰가 있으며 관련 ViewModel에는 ObservableCollections 속성이 있습니다.

이 경우 모범 사례 설계가 궁금합니다 .... ViewModel에서 xaml에 바인딩되거나 각 모델 (GroupViewModel 및 ContactViewModel과 같은)에 대한 ViewModel을 작성하는 위와 같은 하나의 특성을 갖는 대신 목록이있는 ObservableCollections입니다.

가장 좋은 방법은 (디자인 현명한) 무엇입니까? Shoudl 모델 또는 ViewModel을 xaml에 바인딩합니까?

+0

뷰 모델에 바인딩해야합니다. –

답변

3

나는 두려운 것이 있습니다. MVVM의 기본 내용은

  • 모델 - 응용 프로그램이 작업하고있는 데이터가 포함되어 있습니다. 그것은 가능한 한 간단하게 유지되어야합니다.
  • ViewModel - 응용 프로그램의 상태를 반영하고 비즈니스 논리를 포함합니다. 그것은 비즈니스 계층입니다.
  • 보기 - 비즈니스 계층과 해당 상태를 시각적으로 표시하도록 ViewModel을 해석합니다.

이 세 부분을 통해 우려를 분리하고 분리 된 아키텍처를 제공하는 것이 매우 쉽습니다. 더 읽고 싶다면 click here. 질문으로 돌아 가기

: 특정 경우

그룹 및 연락처라는 두 가지 모델 (데이터 클래스)가있다. 그룹에 연락처 목록이 포함되어 있습니다. 둘 다 INotifyPropertyChanged 인터페이스를 구현하고 있습니다.

다소 이상합니다. 일반적으로 모델 클래스에 INotifyPropertyChanged을 구현할 필요가 없습니다. VM이 뷰의 값 변경을 처리해야하기 때문입니다.

하지만 모델 계층에서도 이와 같은 메커니즘을 사용할 수 있습니다. 그러나이 레이어와 IMHO의 변경 사항을 추적하고 싶지 않으므로 VM이 신경 써야 할 필요가 없습니다.

[...]를 XAML 결합되는 뷰 모델에서 상기와 같은 특성을 갖는 하나 또는 (GroupViewModel ContactViewModel과 같은) 각각에 대한 모델 뷰 모델을 createing [...]

예 , 이것은 일반적으로 접근법입니다. 뷰 계층으로 전달되어야하는 각 모델 클래스에 대해 ViewModel을 작성하십시오.

[...] 대신 List가있는 ObservableCollections가 있습니다.

List<T>을 사용하는 경우 뷰는 컬렉션에 대한 변경 (추가, 제거)을 인식하지 못합니다.

가장 좋은 방법은 (디자인 현명한) 무엇입니까? Shoudl 모델 또는 ViewModel을 xaml에 바인딩합니까?

단순히 MVVM을 고수하십시오. 뷰는 VM을 인식하지만 VM은 뷰를 인식하지 못합니다. 또한 VM은 모델을 인식하지만 모델은이를 인식하지 못합니다. 즉, 항상 VM을 View에 바인딩해야합니다.

다음

편집은 완전히 합법적이다.

public class Address : ViewModelBase // implements INotifiedPropertyChanged a.s.o. 
{ 
    public string Street { /* you know what comes here */ } 
    public string ZipCode { /* ... */ } 
    public string City { /* ... */ } 

    /* more properties */ 
} 

public class Person : ViewModelBase 
{ 
    public string Name { /* ... */ } 

    public Address Address { /* ... */ } 
} 
+0

의견을 보내 주셔서 감사합니다 ObservableCollection을 갖는 대신 ObservableCollection 을 갖습니다. 내 잘못 :) –

+0

xaml의 모델 대신 ViewModel을 바인딩하는 것이 더 좋습니다. –

+0

그것은 관점이나 패턴에 따라 다릅니다. VM을 만들 때 가치가없는 시나리오 (예 : 작은 응용 프로그램)가있을 수 있습니다. 그러나 MVVM을 고수한다면 ... 그렇습니다. 유일한 방법입니다. 이것은 기본 메커니즘 중 하나입니다. – DHN