2010-02-17 4 views
9

그래서 나는 새로운 개발을 실제로 따르지 않았던 약간의 시간 이후에 MVVM을 다시보고 있었고 자습서/가이드 등의 양이 크게 증가했다는 것을 알게되었습니다. 그러나 MVVM의 예제/예제 구현의 대부분은 나에게 분명하지 않은 것을 설명하지 못합니다. 이 예제들은 모두 매우 간단하며 그들 중 누구도 데이터베이스/파일/etc 형식을 읽지 않습니다.MVVM 설명 : ViewModel에 속한 것은 무엇이며, 모델에 속하는 것은 무엇입니까?

예를 들어 페인트와 같은 응용 프로그램이 있고 그림을 XAML에 저장합니다. 모델에 속한 것이 ViewModel에 속하는 것은 무엇입니까?

모델 공급 기능을 사용하여 XAML 파일에서 그림을로드/저장 할 수 있습니까?

ViewModel이 모델에서 노출하는 속성 (색상, 너비, 위치 등)에 바인딩됩니까?

유효성 검사가 모델 또는 ViewModel에서 발생합니까?

답변

2

ViewModel은 사용중인 프리젠 테이션 기술에 적합한 모델을 나타냅니다.

예를 들어, 모델에서 XAML 파일의 그림을로드/저장하는 기능을 제공하지 않는다고 생각합니다. 이는 Model 인스턴스를 입력으로 사용하는 ViewModel에 의해 호출 될 데이터 액세스 객체/저장소에서 수행됩니다. 이 비트는 종종 가변적이지만 모델 클래스의 모양에 따라 다릅니다.

ViewModel 자체는 일반적으로 데이터 바인딩을 사용하지 않습니다. 프레젠테이션 (보기) 기술에 유용한 방식으로 모델을보기에 표시합니다. WPF/Silverlight의 경우 기본적으로 INotifyPropertyChanged 인터페이스를 구현합니다.

일반적으로 유효성 검사는 ViewModel에서 수행되지만 ViewModel에 의해 모델에 위임되는 View (거의 모든 것)로 시작됩니다. 물론 응용 프로그램 전체에서 유효성 검사를 반복하지 않는 것이 가장 좋습니다. 공통 유효성 검사를위한 가장 좋은 장소는 Model (IDataErrorInfo 참조)입니다. 그러나 ViewModel에 고유 한 유효성 검사는 ViewModel에서 직접 처리 할 수 ​​있습니다.

+0

Model에서 발생하는 데이터 변경 사항이 ViewModel에 노출되어 정상적인 데이터 바인딩을 통해 View에 바인딩되고 업데이트 될 수 있다는 것에 대한 논의가 필요하다고 생각합니다. 데이터 계층을 생각하면 해당 데이터를 유지 관리하는 과정에서 가져온 데이터 상태에 대한 측정 항목을 갖게됩니다 (특히 오프라인 데이터 저장소를 생각해보십시오). 이러한 메트릭이 존재하고 Model 레이어에서 변경된 경우 View에서 데이터 바인딩을 위해 Model에서 ViewModel로 변경 알림을 푸시하는 방법은 무엇입니까? – ScottCher

0

ViewModel은 Model 객체의 래퍼 일 수 있으며 프레젠테이션 세부 정보로 확장 할 수 있습니다. 예를 들어 Model 객체 (Pen)가있는 경우 PenViewModel은 IsSelected, IsDragging 속성 등을 포함 할 수 있습니다. ViewModel을 래퍼으로 포함 할 수 있습니다.

ViewModel은 특정 컨트롤에 대한 참조를 포함하지 않는 View의 추상화 일 수 있습니다. MVVM의 목표 중 하나가 유닛 테스트임을 잊지 마십시오. 예를 들어, 페인팅 애플리케이션에 드래그 가능한 막대가 있습니다. BarViewModel {IsSnapped, Position, IsEnabled}, BrushBarViewModel : BarViewModel, PenBarViewModel 등을 사용하여이 기능을 추상화 할 수 있습니다. 그런 다음 단위 테스트로이 기능을 다룰 수 있지만이 모든 것은 Model과 아무 관련이 없습니다. 이것은 ViewModel as 추상화보기입니다.

모델은 비즈니스에 매우 가깝고 비즈니스 엔티티와 로직, 엔티티, 서비스를 유지하는 클래스를 포함합니다. 모델에서 다른 개념을 사용할 수 있습니다 (예 : DDD (Domain-Driven-Design), Fawler의 엔터프라이즈 패턴, CQRS (Command Query Responsibility Segregation), SOA (Service Oriented Architecture).

보기는 바인딩 메커니즘을 사용하여 ViewModel (Model)과 상태를 동기화합니다. 최악의 경우는 PresentationModel 패턴과 같습니다.이에

기지가 될거야 질문에 대답하라 :

/로드합니다 XAML 파일에 /에서 그림을 저장하기 위해 모델 공급 기능을합니까?

번호 모델은 XAML 파일을 직접 참조하지 않습니다.

는 모델이 노출 (색상, 폭, 위치 등) 특성에 뷰 모델 바인딩을합니까?

번호 바인딩은보기 동기화의 메커니즘입니다. 따라서 View를 해당 속성에 바인딩해야합니다. View를 Model 또는 ViewModel 래퍼에 직접 바인드 할 수 있습니다.

유효성 검사는 모델 또는 ViewModel에서 발생합니까?

휘렌 버. 컨트롤이 유효성 검사를 지원하면 View 레이어에서 유효성을 검사 할 수 있습니다 (예 : DateTimePicker는 잘못된 날짜를 선택할 수 없습니다. ViewModel에서 사용자 정의 유효성 검사 로직을 작성하고 단위 테스트로 커버 할 수 있습니다. 또한 모델은 유효하지 않은 상태이므로 추가 확인으로 모델 수준에서 유효성 검사를 수행 할 수 있습니다.