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에서 사용자 정의 유효성 검사 로직을 작성하고 단위 테스트로 커버 할 수 있습니다. 또한 모델은 유효하지 않은 상태이므로 추가 확인으로 모델 수준에서 유효성 검사를 수행 할 수 있습니다.
Model에서 발생하는 데이터 변경 사항이 ViewModel에 노출되어 정상적인 데이터 바인딩을 통해 View에 바인딩되고 업데이트 될 수 있다는 것에 대한 논의가 필요하다고 생각합니다. 데이터 계층을 생각하면 해당 데이터를 유지 관리하는 과정에서 가져온 데이터 상태에 대한 측정 항목을 갖게됩니다 (특히 오프라인 데이터 저장소를 생각해보십시오). 이러한 메트릭이 존재하고 Model 레이어에서 변경된 경우 View에서 데이터 바인딩을 위해 Model에서 ViewModel로 변경 알림을 푸시하는 방법은 무엇입니까? – ScottCher