MVVM에서 ViewModel 또는 View가 새 뷰를 생성해야합니까? 목적을 위해 표시 / 숨김 패널과 같은

내 WPF 응용 프로그램에서 새보기를 만들고 싶습니다. ViewModel 또는 Model 에서 어디에서해야 합니까?

이 응용 프로그램은 단일 “보내기”버튼이있는 (현재로서는 매우 간단한) 단일 창 형태의 도구입니다. 확인란 중 하나를 선택하면 동일한 ViewModel을 사용하는 새 창이 팝업되어 사용자에게 추가 세부 정보를 요청합니다. 이 질문의 목적을 위해 표시 / 숨김 패널과 같은 다른 접근 방식을 고려하지 않고 새로운 창 접근 방식 만 고려해 봅시다.

이상적으로 View에는 코드가 없어야합니다. 또한 View에는 논리가 없으므로 VM은 처음에 새보기를 작성해야하는지 확인해야하며, 필요한 경우이 책임을 View로 되돌려 서 코드를 부풀려 야합니다.

반면, ViewModel에서 새 뷰를 생성하면 ViewModel이 View에 대해 아무 것도 알 수 없다는 원칙을 위반합니다.

그렇다면 View 또는 ViewModel에서 새 뷰를 만드는 것이 더 낫습니까?



답변

IViewFactory두 가지 제약 조건을 모두 존중하기 위해 의존성 주입과 뷰 모델에 주입했습니다.

A는 ProductViewModel(예를 들어)를 호출 this.viewFactory.Show("Details", this)ProductDetailsView자체로 ProductViewModel. 로 다른 뷰 모델을 기반으로 뷰를 열 수도 있습니다 this.viewFactory.Show<ClientViewModel>().

구현 (실제로 WinForms, 간단한 Wpf Windows, 탭이있는 Wpf 쉘 등 여러 가지가 있음)은 StructureMap규칙을 기반으로합니다 . 뷰는 IView<ProductViewModel>인터페이스 를 통해 뷰 모델을 지정합니다 .

따라서 뷰 모델은 해당 역할 (기본 뷰, 상세 뷰 등)을 제외하고 뷰에 대해 아무것도 알지 못하며 뷰에는 다른 뷰를 생성하는 코드가 없습니다. 또한 뷰 모델은 Wpf 어셈블리를 참조하지 않는 별도의 어셈블리에 있습니다.


답변

이론적 답변

가있는 경우 ViewModel미용 효과가있는 작업 (예 : 마우스 오버에서 항목 강조 표시)이 작업이고 View“실제”효과가있는 작업 (예 : 새 창 생성)이 작업입니다 ViewModel.

따라서 새 창을 만드는 것은의 작업입니다 ViewModel. 그러나 View 나 ViewModel창은 정확히 Window를 만드는 방법을 모릅니다. 이는 책임의 일부가 아니며 다른 클래스에 속합니다.

새 창을 만드는 것이의 작업이라고 주장 할 수 View있습니다. 동의하지는 않지만 그러한 토론에는 가치가 거의 없습니다. 실제로 코드를에 배치하면 세계의 끝 View이 아니며 ViewModel나중에 코드 를 옮기는 데 많은 노력을 기울이지 않기 때문입니다. . 중요한 부분은 새 창을 만드는 논리가 독립적 인 클래스, 일반적으로 일종의 WindowFactory에 포함된다는 것입니다. MVVM, MVP, MVC 등의 요점은 책임이 거의 정의되지 않은 클래스가 있다는 것입니다. 따라서 View, 에 추가 책임을 추가 하지 않아도 ViewModel되거나 Model필요하지 않은 경우가 있습니다.

어떤 상황에서도 윈도우 생성은에 속해 있지 않습니다. GUI와 같은 것이 있다는 것을 알지 못 Model하기 때문 Model입니다.

실용 답변

이것은 “단일”보내기 “버튼 이있는 하나의 창 모양 도구입니다 . 여기 내 관련 답변을위한 뻔뻔한 플러그가 있습니다. 왜 MVVM을 사용합니까?

그 대답의 요약 : 간단하게 유지하십시오. 오, 단 하나의 버튼 창이 더 복잡해지기 시작하면 위의 이론적 대답을 명심하십시오.