어떤 조건에서 MVVM을 사용하는 것이 적절합니까?


47

Model View View-Model은 이벤트 중심 프로그래밍, 특히 WAM (Windows Presentation Foundation) 및 XAML 및 .NET 언어를 사용하는 .NET 플랫폼의 Silverlight를 지원하는 UI 개발 플랫폼을 대상으로 개발되었습니다. 그 이후로 Angular, Knockout 및 ExtJS와 같은 많은 Javascript 프레임 워크가이 패턴을 채택했습니다.

여기에 이미지 설명을 입력하십시오

대부분의 소프트웨어 패턴과 마찬가지로 MVVM에는 적절한 용도와 남용이 있습니다. 어떤 조건에서 MVVM을 사용하는 것이 적절합니까? 언제 조언을받지 않습니까?


4
안타깝게도 현실 세계에는 정확하게 정의 할 수없는 많은 복잡성이 있습니다. 특정 시점을 넘어서서, 그것이 어떤 것에 의존하는지 말할 수는 없습니다-각각의 특별한 경우는 드물지만, 가능한 특별한 경우의 범위는 무한하며, 일어날 때까지 모두 발견 될 수는 없습니다. 어떤 시점에서는 패턴 등에 대한 기본 목표를 알고 그 목표가 달성되지 않을 때를 인식 할 수 있어야합니다. 그에 대한 완벽한 계획은 없지만 경험이 도움이됩니다.
Steve314

1
@ Steve314 논쟁의 여지가 있습니다. 나는 이것이 이것에 달려 있다고 말한다 : MVVM이 아름다운 디자인을 방해하지 않도록하고, 제품 배송을 막지 않도록하십시오.
Luke Puplett

@Luke-사실이지만, 내 요점은 또한 아름다운 디자인으로 인해 제품 배송을 중단해서는 안된다는 것입니다. 좋은 디자인 패턴은 적절하게 사용하고 현실 세계가 행동하는 한에만 좋습니다.
Steve314

@ Steve314 Roger 저것.
Luke Puplett

답변:


19

MVVM 은 고화질 UI를 사용하여 복잡한 사용자 상호 작용이 필요한 경우 (예 : WPF ) 사용하기위한 것입니다.

MVVM은 최신 UI 개발 플랫폼 (Windows Presentation Foundation 또는 WPF 및 Silverlight)을 대상으로하며, 여기에서보다 "전통적인"개발자와는 다른 요구 사항이있는 사용자 경험 (UXi) 개발자가 있습니다 (예 : 비즈니스 로직 및 백엔드 개발). MVVM의 View-Model은 "기본적으로 스테로이드의 가치 변환기"입니다. 즉, View-Model은 해당 개체를 쉽게 관리하고 소비하는 방식으로 Model에서 데이터 개체를 노출해야합니다. 이와 관련하여 View-Model은 View보다 Model이며 View의 모든 디스플레이 논리가 아닌 대부분을 처리합니다.

MVVM은 WPF의 특정 기능을 사용하여 View 레이어에서 거의 모든 "코드 숨김"을 제거하여 나머지 패턴에서 View 레이어 개발을보다 쉽게 ​​분리 할 수 ​​있도록 설계되었습니다. 대화 형 디자이너가 View 코드를 작성하지 않아도 네이티브 WPF 마크 업 언어 XAML을 사용하고 응용 프로그램 개발자가 작성 및 유지 관리하는 ViewModel에 대한 바인딩을 만들 수 있습니다. 이러한 역할 분리를 통해 대화 형 디자이너는 프로그래밍 또는 비즈니스 논리가 아닌 UX 요구에 집중할 수 있으므로 응용 프로그램 계층을 여러 작업 스트림에서 개발할 수 있습니다.

이러한 종류의 풍부한 상호 작용이 필요하지 않은 UI의 경우 MVVM이 너무 과도 할 수 있습니다. MVP가 더 자연스러운 선택 일 수 있습니다. 웹 응용 프로그램의 경우 MVC가 더 적합합니다. 작은 Winforms 유틸리티와 같이 더 이상 커지지 않는 매우 작은 응용 프로그램의 경우 코드 숨김이 적합합니다.


1
몇 년 빨리 감기 : 녹아웃에 대해 어떻게 생각하십니까? 나는 WPF에서 나온 후 그것을 사용했고 WPF와 비교했을 때 그것이 얼마나 가벼워 졌는지 알게되어 기뻤습니다.
J Trana

15

때로는 MVVM이 함정일 수 있습니다. 내 경험상 그것은 작업 지향 UI보다 CRUD와 같은 응용 프로그램 (데이터 형식)을 선호합니다. 애플리케이션의 백엔드 / 기타 계층에 잘못된 아키텍처를 의미한다고 말하지는 않지만 "DDD light"아키텍처와 함께 제공되는 많은 MVVM 애플리케이션을 보았습니다. 바인딩이 너무 쉽고 POCO / Anemic 도메인 객체를 사용하여 ORM 및 MVVM / 바인딩을 사용하여 응용 프로그램을 설정하는 것이 매우 간단하기 때문에 왜 정확한지 알 수 없습니다.


10
개발자의 상상력 부족은 패턴의 실패가 아닙니다. 작업 지향 ViewModel은 작성하기가 매우 쉽습니다.
Sean

6
이러한 약어 중 일부를 확장 할 수 있습니다.
로마 라이너

13

MVVM은 잘못 설계된 데이터 바인딩 계층을위한 반창고입니다. 특히 WPF / XAML의 데이터 바인딩 제한으로 인해 WPF / silverlight / WP7 세계에서 많이 사용되었습니다.

이제부터는 WPF / XAML에 대해 이야기하고 있다고 가정하겠습니다. MVVM이 WPF / XAML에서 해결하기 위해 제시 한 몇 가지 단점을 살펴 보겠습니다.

데이터 형태와 UI 형태

MVVM의 'VM'은 C #에 정의 된 개체 집합을 만들어 XAML에 정의 된 프레젠테이션 개체 집합에 매핑합니다. 이러한 C # 개체는 일반적으로 프레젠테이션 개체의 DataContext 속성을 통해 XAML에 연결됩니다.

결과적으로, 뷰 모델 객체 그래프는 애플리케이션의 프리젠 테이션 객체 그래프에 매핑되어야합니다. 즉, 매핑이 일대일이어야한다고 말하지는 않지만 목록 컨트롤이 창 컨트롤에 포함되어 있으면 창의 DataContext 개체에서 해당 목록의 데이터를 설명하는 개체로 가져올 수있는 방법이 있어야합니다.

viewmodel 객체 그래프는 ui 객체 그래프에서 모델 객체 그래프를 성공적으로 분리하지만 추가로 작성하고 유지해야하는 추가 뷰 모델 레이어를 희생합니다.

화면 A에서 화면 B로 일부 데이터를 이동하려면 뷰 모델을 엉망으로 만들어야합니다. 비즈니스 사람을 위해 이것은 UI 변경입니다. 그것은 해야 XAML의 세계에서 순수하게 이루어집니다. 슬프게도, 거의 할 수 없습니다. 더 나쁜 것은 뷰 모델이 구성되는 방식과 데이터가 얼마나 활발하게 변경되는지에 따라이 변경을 수행하기 위해 약간의 데이터 재 라우팅이 필요할 수 있습니다.

표현력이없는 데이터 바인딩 문제 해결

WPF / XAML 바인딩의 표현이 충분하지 않습니다. 기본적으로 개체에 접근 할 수있는 방법, 트래버스 할 속성 경로 및 프레젠테이션 개체에 필요한 데이터 속성 값에 맞게 변환기를 바인딩하는 방법을 제공합니다.

C #의 속성을 그보다 복잡한 것에 바인딩 해야하는 경우 기본적으로 운이 좋지 않습니다. 바인딩 변환기가 없으면 WPF 앱을 본 적이 없습니다.이 변환기는 true / false를 Visible / Collapsed로 바꿨습니다. 많은 WPF 앱은 NegatingVisibilityConverter 또는 이와 유사한 것을 극성을 뒤집는 경향이 있습니다. 알람 벨을 설정해야합니다.

MVVM은이 한계를 극복하는 데 사용할 수있는 C # 코드를 구성하기위한 지침을 제공합니다. 뷰 모델에 SomeButtonVisibility라는 속성을 노출하고 해당 버튼의 가시성에 바인딩하면됩니다. 이제 XAML이 멋지고 예쁘지 만 점원이되었습니다. 이제 UI가 발전 할 때 두 위치 (UI 및 C #의 코드)에 바인딩 바인딩을 노출 + 업데이트해야합니다. 다른 화면에 동일한 버튼이 있어야하는 경우 해당 화면이 액세스 할 수있는 뷰 모델에 유사한 속성을 표시해야합니다. 더 나쁜 것은 XAML을보고 더 이상 버튼이 표시되는 시점을 볼 수 없다는 것입니다. 바인딩이 약간 사소하지 않게 되 자마자 C # 코드에서 형사 연구를해야합니다.

데이터에 대한 접근은 적극적으로 이루어집니다

데이터는 일반적으로 DataContext 속성을 통해 UI에 입력되므로 앱 전체에서 전역 또는 세션 데이터를 일관되게 표현하기가 어렵습니다.

'현재 로그인 한 사용자'라는 아이디어는 훌륭한 예입니다. 이는 종종 앱 인스턴스 내에서 실제로 전 세계에있는 것입니다. WPF / XAML에서는 현재 사용자에게 일관된 방식으로 전역 액세스를 보장하기가 매우 어렵습니다.

내가하고 싶은 것은 데이터 바인딩에서 "CurrentUser"라는 단어를 자유롭게 사용하여 현재 로그인 한 사용자를 참조하는 것입니다. 대신, 모든 DataContext가 현재 사용자 객체에 접근 할 수있는 방법을 제공해야합니다. MVVM은이를 수용 할 수 있지만 뷰 모델은 모두이 글로벌 데이터에 대한 액세스를 제공해야하기 때문에 혼란 스러울 것입니다.

MVVM이 넘어지는 예

사용자 목록이 있다고 가정 해보십시오. 각 사용자 옆에 "사용자 삭제"버튼을 표시하려고하지만 현재 로그인 한 사용자가 관리자 인 경우에만 가능합니다. 또한 사용자는 자신을 삭제할 수 없습니다.

모델 객체는 현재 로그인 한 사용자에 대해 알지 않아야합니다. 데이터베이스에있는 사용자 레코드 만 나타내지 만, 현재 로그인 한 사용자는 목록 행 내의 데이터 바인딩에 노출되어야합니다. MVVM은 현재 로그인 한 사용자를 해당 목록 행으로 표시되는 사용자로 구성하는 각 목록 행에 대해 뷰 모델 객체를 생성 한 다음 해당 느낌에 따라 해당 뷰 모델 객체에 "DeleteButtonVisibility"또는 "CanDelete"라는 속성을 노출해야합니다. 바인딩 변환기에 대해).

이 객체는 대부분의 다른 방법으로 User 객체와 끔찍하게 보일 것입니다. 모든 사용자 모델 객체의 속성을 반영하고 변경 될 때 해당 데이터로 업데이트를 전달해야 할 수도 있습니다. MVVM은 사용자와 유사한 객체를 유지 관리해야하므로 점원이됩니다.

데이터베이스, 모델 및 뷰에서 사용자의 속성을 나타내야 할 수도 있습니다. 데이터베이스와 API 사이에 API가 있으면 데이터베이스, API 서버, API 클라이언트, 모델 및 뷰에 표시됩니다. 속성을 추가하거나 변경할 때마다 터치해야하는 다른 레이어를 추가 한 디자인 패턴을 채택하는 것이 정말 주저합니다.

더 나쁜 것은이 계층은 데이터 모델의 복잡성이 아니라 UI의 복잡성에 따라 확장되는 것입니다. 동일한 데이터가 여러 장소와 UI에 표시되는 경우가 많습니다. 레이어를 추가 할뿐만 아니라 표면 영역이 많은 레이어를 추가합니다.

상황이 어땠 을까

위에서 설명한 경우에 다음과 같이 말하고 싶습니다.

<Button Visibility="{CurrentUser.IsAdmin && CurrentUser.Id != Id}" ... />

CurrentUser는 내 앱의 모든 XAML에 전 세계적으로 노출됩니다. ID는 내 목록 행에 대한 DataContext의 속성을 참조합니다. 가시성은 부울에서 자동으로 변환됩니다. Id, CurrentUser.IsAdmin, CurrentUser 또는 CurrentUser.Id를 업데이트하면이 단추의 가시성에 대한 업데이트가 트리거됩니다. 쉬워요.

대신 WPF / XAML은 사용자가 완전한 혼란을 만들도록합니다. 내가 알 수있는 한, 일부 창조적 인 블로거는 그 엉망에 이름을 쳤고 그 이름은 MVVM이었습니다. 속지 마십시오. GoF 디자인 패턴과 같은 클래스가 아닙니다. 이것은 추악한 데이터 바인딩 시스템을 해결하기위한 추악한 해킹입니다.

(이러한 접근 방식은 더 자세한 정보를 원할 경우 "기능적 반응성 프로그래밍"이라고도합니다.)

결론적으로

WPF / XAML에서 작업해야하더라도 여전히 MVVM을 권장하지 않습니다.

복잡한 데이터 바인딩 표현식 + 유연한 값 강요를 사용하여 코드가보기에 직접 노출 된 모델과 같이 "어떻게 할 수 있었는지"와 같이 구조화되기를 원합니다. 더 읽기 쉽고 쓰기 가능하며 유지 관리가 용이합니다.

MVVM은 코드를 좀 더 간결하고 유지 보수가 덜 쉬운 방식으로 구성하도록 지시합니다.

MVVM 대신 좋은 경험을 근사하는 데 도움이되는 몇 가지 사항을 작성하십시오. UI에 전역 상태를 일관되게 노출시키는 규칙을 개발하십시오. 보다 복잡한 바인딩 표현을 표현할 수있는 바인딩 변환기, 멀티 바인딩 등을 사용하여 툴링을 구축하십시오. 일반적인 강압 사례를 덜 고통스럽게 만들 수 있도록 바인딩 변환기 라이브러리를 구축하십시오.

XAML을보다 표현적인 것으로 대체하십시오. XAML은 C # 개체를 인스턴스화하기위한 매우 간단한 XML 형식으로,보다 표현적인 변형을 만드는 것은 어렵지 않습니다.

내 다른 권장 사항 : 이러한 종류의 타협을 강제하는 툴킷을 사용하지 마십시오. 문제 영역에 초점을 맞추지 않고 MVVM과 같은 크랩으로 밀어서 최종 제품의 품질을 떨어 뜨릴 수 있습니다.


23
-1 :이 점의 대부분은 얕고 특정 WPF 기능을 사용하면 대부분의 문제를 해결할 수 있습니다. MVP 패턴의 요점을 완전히 놓친 것 같습니다.
팔콘

14
예 : "여기에는 데이터가 그렇게 작동하지 않는 큰 단점이 있습니다. 데이터의 모양이 UI의 모양과 매우 다를 수 있습니다." 맞습니다-그래서 ViewModel이 처음에있는 이유입니다.
팔콘

8
이것은 약간 너무 많은 FUD tbh입니다. 우선 WPF 어셈블리에 BooleanToVisibilityConverter가 있으므로 따로 만들 필요가 없습니다. 그런 다음 세션에서 오는 정적 정보에 바인딩하려는 경우 x : Static을 사용할 수 있습니다. RelativeSource와 같은 것을 사용하여 일부 상위 VM 정보에 액세스 할 가능성이 큽니다. 그런 다음 템플릿과 스타일을 사용하여 설명하는 많은 문제를 해결합니다. 그런 다음 다중 바인딩을 수행 할 수 있습니다. 목록에 계속 ...
flq

8
나는이 답변에서 질문의 목적 중 일부가 사라 졌다고 생각하며 WPF / SL에 대한 폭언이되었습니다. 그 대답은 주로 패턴이 제공하는 역할과 원칙에 대해 토론하는 것이 아니라 특정 구현을 만드는 데 어려움이 있습니다. 또한 솔직히 말하면이 답변에 언급 된 많은 것들이 MVVM이 시도한 밑줄 기술에 대한 더 많은 지식을 필요로합니다. 언급 된 많은 문제에 대한 해결책이 있습니다. 이 답변에서 ViewModel의 역할을 잊어 버린 것 같습니다.
Kelly Sommers

8
이것은 민주주의가 최악의 정부 형태 (이전의 모든 형태를 제외하고)와 같은 일종의 진술처럼 보입니다. 물론 WPF에는 문제가 있지만 지옥은 winforms를 이길 것입니다. MVVM이 포함 된 WPF는 사소한 앱보다 큰 MVVM을 사용하지 않는 것보다 훨씬 쉽습니다.
Joel Barsotti

8

나는 MVVM을 정말 좋아하고 도전 과제가 동기를 부여하고 많은 이점을 보았지만 ...

  1. 성능을 유지하면서 많은 사용자 지정 동작을 추가하기 위해 많은 UI / 상호 작용 코드가 필요한 응용 프로그램 또는 게임의 경우 약간 더러운 MVVM을 사용하는 것이 좋습니다-유용하거나 데이터 중심이 아닌 경우에 사용하십시오 코드의 상호 작용 중심 영역. 컨트롤을 만들고 다른 부모 컨트롤간에 이동하거나 캐시하지 않으려는 경우 ...

  2. 학습 곡선이 상당히 가파르므로 시간이 없으면 WPF / SL에서 많은 것을 개발할 계획이 있고, 디자이너가 Blend에 능숙 해 지도록하거나, UI에 대한 테스트 코드를 작성할 필요가 있거나 프로젝트-지불하지 않을 수 있습니다.

  3. 많은 디자이너들이 Blend를 아는 것은 아니지만, 모든 프로젝트가 프레젠테이션 계층에 대한 자동화 된 테스트에 집중할 필요는 없습니다. 어쨌든 수동으로 테스트해야하기 때문에 VM 테스트가 아닌 가장 중요한 버그를 찾는 방법입니다.

  4. 정말 투자입니다. 먼저 WPF / SL 및 XAML의 기본 사항을 파악한 다음 바인딩을 올바르게 수행하고 vms와 어떤 순서로 연결하고 명령을 올바르게 수행하고 대부분의 경우 프레임 워크를 선택하는 방법을 알아 내야합니다. 라이센싱으로 인해 문제가 발생하고, 코드를 효율적으로 코딩하기 위해 sippets 라이브러리를 빌드하고, 플랫폼이 바인딩과 항상 잘 작동하지 않고 필요한 것을 얻을 수있는 동작 라이브러리를 빌드해야하는 경우에만 발견하십시오.

전반적으로 – 만약 당신이 모든 장애물을 극복하고 패턴에서 상당히 효율적이되면 – 그것은 모두 명확성, 유지 보수성 및 ... 자랑하는 권리를 상환합니까? :)


학습 곡선이 가파르다는 데 동의하지 않습니다. 오후에는 MMVM에 대해 충분히 배울 수 있습니다. 또한 MVVM에는 Blend를 아는 것이 필요하지 않습니다.
Sean

6
@Sean, 죄송합니다. 3 일째인데도 여전히 어려움을 겪고 있습니다. (아마 대화 상자를 열거 나 선택한 항목을 모델의 트 리뷰에서 설정하는 것과 같은 '복잡한'작업을하려고하기 때문일 수 있습니다.
Benjol

8

저는 MVVM에서 트레이딩 시스템과 같은 거대한 응용 프로그램을 구축하는 몇 년 동안 WPF / Silverlight 프로그래머였습니다.

몇 년이지나면서 나는 엄격한 MVVM이 시간과 돈을 소비한다는 것을 알게되었습니다. 엄밀히 말하자면, "코드 없음"과 같은 규칙을 의미합니다.

코드 숨김이 아닌 가장 기본적인 양식 / 데이터베이스 앱 외에는 불가능합니다.

설계자는 표준 컨트롤로는 불가능한 첫날 무언가를 지정할 것이므로 MVVM을 사용하는 동안 상호 작용 패러다임을 지원하기 위해 일련의 사용자 지정 컨트롤을 작성하거나 기존 컨트롤을 래핑해야합니다.

나는 수학, 관성, 제스처 등의 노력과 그 노력을 사용하여 모든 종류의 UI 컨트롤을 작성했습니다.

그러나 이것은 모든 코드 숨김이며,보기에 없습니다. 버튼 클릭, 스크롤, 드래그 등을 처리해야하지만 모두 컨트롤 세트로 멋지게 싸여 있어이 코드를 숨김 상태로 만들 수 있습니다.

단순히 코드 숨김 및 영리한 UI를 작성하기 위해 뷰에 코드를 작성하는 것이 더 쉽습니다.

MVVM의 목표는 응용 프로그램 / 비즈니스 논리를 UI 논리와 분리하는 것입니다. 바인딩 시스템과 MVVM은이 작업을 수행하는 좋은 방법입니다.

한 책상의 XAML 디자이너, 다른 책상의 C # 프로그래머, 다른 VS의 블렌드에서 일하는 것과 같은 다른 목표는 잘못입니다.

UI를 빠르게 재 설계 할 수 있다는 것은 또 다른 오류입니다. 조기 최적화는 일어나지 않습니다. 모든 주요 재 작업은 뷰 모델에 많은 작업이 필요합니다. 조정은 한 가지이지만 빠른 UI 점검은 불가능합니다. 뷰 모델은 상호 작용 패러다임에 맞아야하므로 커플 링이 예상보다 빡빡합니다.

나를 위해 MVVM을 사용하여 응용 프로그램 논리를 별도로 유지합니다 (보통 테스트 가능한 컨트롤러와 일련의 논리가없는보기 모델을 사용합니다).하지만 UI를 섹시하게 보이게하고 행동시키는 데 필요한 코드와 트릭은 무엇이든 아닙니다. 땀이 나

그렇지 않으면 당신은 당신의 디자인, 멋진 애니메이션 등을 지배하게 될 것입니다. 단지 MVVM을 어떻게 배열 할 것인지에 대한 아이디어가 너무 마음에 들지 않기 때문입니다.

MVVM은 인생의 대부분의 것들과 마찬가지로 두 극단 사이에 달콤한 곳 있습니다.

소프트웨어 디자인에서 가장 중요한 것은 제품을 조기에 배송하여 사용되는 기능, UI가 잘 작동하는지, 아무도 사용하지 않는 제품에 대한 아름다운 코드를 작성하지 않는 것입니다.


7

애플리케이션에서 실시간으로 과도한 양의 데이터에 바인딩해야하는 경우 MVVM은 프로세스 속도를 늦추는 추상화를 도입하고 실제로 WPF / Silverlight / WP7에 대해 이야기하고 있다고 가정 할 때 실제로 방해가 될 수 있습니다. 엔진은 현재 그렇게 효율적이지 않습니다. 개선이 진행되고 있지만.

MVVM은 그 자체로 고려해야 할 방정식의 유일한 부분도 아닙니다. 연결이 끊어진 ViewModel간에 통신 할 수 있도록 중재자 패턴과 같은 인프라를 통해 순수 MVVM을 지원해야합니다.

위의 blucz의 의견에도 불구하고 MVVM은 GoF 패턴의 라인에 있습니다. 패턴을 살펴보면 MVVM은 MVVM과 거의 동시에 나타나는 Model View Passive Presenter 패턴과 동일합니다. MVVM의 복잡성에 대해 사람들이 MVVM을 사용하여 설계하는 방법을 이해하지 못하기 때문에 불만을 제기하는 경우가 많습니다.

MVVM에서 문제를 발견 한 또 다른 영역은이를 지원하도록 설계되지 않은 타사 기술 (예 : MS Dynamics의 UII 프레임 워크)을 통합해야합니다. 때로는 MVVM을 사용하기 위해 다른 기술을 "해킹"하는 것이 가치가 있는지 자문 해보아야합니다.

Win Forms와 같은 것을 WPF 솔루션에 혼합하고 일치시키는 경우 솔루션의 해당 부분이 MVVM에도 적합하지 않을 수 있습니다. MVVM이 적용되지 않는 부분에 대한 아이디어를 얻을 수 있기를 바랍니다.


4

다음과 같은 경우 MVVM 사용이 의미가 없습니다.

  • WPF 또는 Silverlight로 작업하고 있지 않습니다
  • 당신은 개념을 테스트하고 있습니다

그게 다야. 별도의 프로젝트에서 무언가를 테스트하거나 디버깅하지 않는 한 WPF / Silverlight로 작업 할 때 MVVM을 사용하지 않는 이유를 실제로 생각할 수 없습니다. XAML 바인딩이 작동하는 방식 때문에 WPF / Silverlight 개발에 이상적인 디자인 패턴을 발견했습니다.

MVVM의 요점은 전체 응용 프로그램이 ViewModel에서 실행되며 View는 사용자가 ViewModel과 상호 작용하는 데 사용할 수있는 매우 단순한 계층입니다. 버튼을 클릭하고 실제로 ViewModel 메서드를 실행하고 있습니다. 페이지를 변경하고 실제로 ViewModel에서 CurrentPage 속성을 변경합니다.

MVVM을 사용하는 방법은 프로젝트의 크기와 필요한 것에 따라 다르지만 모든 WPF / Silverlight 개발, 작고 간단한 단일 페이지 프로젝트에 MVVM을 사용합니다. MVVM없이 작은 응용 프로그램을 한 번 사용하면 후회하게되었습니다 (나중에 업데이트를 추가하는 동안 MVVM을 사용하도록 리팩터링되었습니다)


3

나는 MVVM으로 변환하려는 시도와 함께 코드 숨김 프로젝트에서 클라이언트를 위해 일했으며 큰 혼란이었습니다. 모든 코드 숨김 프로젝트가 엉망이라는 것은 아닙니다. 뷰에 오류가 발생하거나 Blend가 충돌하여 디자이너에게 문제가 발생했습니다.

RoR을 다루고 ASP.NET Webforms를 사용하여 거의 아무것도 건너 뛰지 않았지만 ASP.NET MVC가 나왔을 때 ASP.NET MVC In Action 서적과 codecampserver를 참조로 사용하여 최대한 많은 것을 배우려고했습니다. . 다른 패턴이지만 SL / MVVM 개발의 In Action 책에서 배운 많은 것들을 사용합니다.

Silverlight로 작업을 시작했을 때 나는 그것이 얼마나 벗겨져 있는지 놀랐고 그것을 입을 수있는 많은 프레임 워크 중 하나를 선택해야한다고 느꼈습니다. 나는 이것이 MVVM 학습을 포기하는 사람들의 문제라고 생각합니다.

나는 우수한 MVVM-Light로 시작 하여 패턴을 팔 수있었습니다. 나중에 Caliburn Micro로 작업을 시작한 후 표시등이 켜졌습니다. 나에게 Caliburn Micro 는 ASP.NET Webforms에서 ASP.NET MVC를 사용하는 것과 같습니다. 따라서 작은 샘플 응용 프로그램의 경우에도 프로젝트 NuGet CM을 만들고 시작했습니다. ViewModel의 첫 번째 접근 방식을 따르고 뷰를 어둡게 유지하고 Blend에서 작업하기 쉽습니다. 내 VM은 테스트 할 수 있으며 CM을 사용하면 복잡한 화면 레이아웃을 쉽게 다룰 수 있습니다.


2

이 대안을 확인하는 것이 좋습니다. 이 옵션은 데이터 바인딩, 데이터 템플릿 및 MVVM의 WPF 방식을 회피합니다. 이 옵션은 기존의 단순하고 신뢰할 수있는 WinForms designer.cs 방식과 비슷합니다.

WPF 복합재

http://wpfcomposites.codeplex.com/

여기서 WPF에 대한 간결한 C # 코드 숨김은 그리드 기반 합성을 통해 UI 위에 간단한 매트릭스를 오버레이하여 생성됩니다. 최신 XAML UI에 몇 개의 텍스트 레이블과 사진 목록 상자 만 포함 된 경우 간단한 코드 행으로 정의 할 수없는 이유는 다음과 같습니다. grid.AddText (guid, x coordinate, y coordinate)? 이것은 캔버스에는 없지만 그리드, 도크 패널 등 WPF 컨테이너 내에 있습니다. WPF는 매우 강력합니다. 이 접근법은 단지 이것을 활용합니다.

개발자는 일반적으로 행렬과 인덱스를 신경 쓰지 않습니다. GUID의 DTO (Data Transfer Object) 또는 POCO로 정의 된 굵은 컨테이너 레벨로 시작한 다음,이 키 컨테이너를 잠재적 행과 열의보다 세밀한 매트릭스로 보완합니까?

위의 코드 플렉스 프로젝트는 ListBox 컨트롤로 시작하여이 방법을 소개하지만 모든 WPF 컴포지트 컨트롤을 포함하도록 확장되었습니다. 예를 들어, 각 목록 상자 항목은 GUID가 추가 된 컴포지트 (클래스와 일대일 관계를 갖는 컴포지트)이며이 항목 내부에는 하위 UI 요소 (하위와 일대일을 특성에 묶음)가있는 그리드가 있습니다. (클래스에서) 코드 숨김을 통해 마음대로 추가 할 수 있습니다. 어린이는 텍스트 블록 또는 이미지 일 수 있습니다.

아이디어는 데이터 템플릿 대신 인덱스와 잘 정의 된 UI 요소 구조 (PresentationFramework.Aero 테마 ListBox를 기반으로 시작)를 활용하는 것입니다. 이 새로운 접근 방식은 의도적으로 수행 할 수있는 작업을 제한하지만 그렇게함으로써 간결하고 강력한 C # 코드 숨김을 직관적으로 얻을 수 있습니다. 스크롤바 스타일링을위한 컨트롤 템플릿 솔루션을 찾아 보거나 간단한 작업을 위해 여러 데이터 템플릿으로 솔루션을 어지럽 힐 필요가 없습니다.


-2

MVVM은 주로 내가 사용하는 UI 프레임 워크를 기반으로합니다. 따라서 WPF 또는 Silverlight와 같은 데이터 컨텍스트 바인딩을 기반으로하는 패러다임을 사용하면 해당 데이터 컨텍스트를 항상 뷰 모델이라고 할 수 있습니다.

따라서이 제어 / 창 / 응용 프로그램의 뷰 모델 인 큰 뚱뚱한 별도 클래스를 언제 작성하고 이미 빌드 된 객체를 사용하여 벗어날 수 있습니까?

따라서 추상화 계층 추가에 대한 고전적인 질문이 있습니다. VM은 프로젝트에 무게, 관성 및 구조를 추가 할 것입니다. 빌드하기가 쉽지만 변경하기가 어렵고 빌드하는 데 시간이 오래 걸립니다. 그러한 것들 중 어느 것도 쉽게 정량화 할 수 없습니다.

저렴한 답변을 위해 MVVM은 명령 줄 앱이나 웹 서비스에 적합하지 않습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.