2013-03-24 6 views
0

MVVM 패턴이 새로 도입되었습니다.# MVVM 프리젠 테이션 로직

보기에는 로그인 버튼과 진행 막대가 있습니다.

저는 LoginViewModel이라는 뷰 모델을 가지고있어 LoginCommand 명령을 노출하고 LoginPage.xaml 뷰에 연결됩니다.

로그인 명령을 실행하면 로그인 버튼을 사용할 수 없으며 진행률 막대가 표시되어야합니다.

로그인에 실패하면 로그인 버튼이 활성화되고 진행률 표시 줄이 숨겨져 야합니다.

나는이 프리젠 테이션 논리가 어디에서 발생해야하는지 확신 할 수 없다. 보기 모드 또는 페이지의 코드 숨김에서 발생해야합니까?

현재 로그인 프로세스가 시작될 때 true로 설정되고 실패하면 false로 설정되는 LoggingIn이라는 뷰 모델에 부울 속성이 있습니다. 이 부울은 각각 버튼과 진행률 표시 줄의 IsEnabled 및 Visibility 속성에 연결됩니다.

이것은 잘못된 것이므로 OnBeginLogin과 OnEndLogin 두 가지 이벤트를 만들고 컨트롤의 시각적 상태를 제어하는 ​​코드의 코드 뒤에 연결해 보았습니다. 그러나 이전 솔루션보다 훨씬 많은 코드가 필요했습니다.

또한 뷰 모델에서 시각적 상태를 뷰 모델에서 제어 할 수 있도록 컨트롤, LoginButtonEnabled 및 ProgressBarVisible에 특정한 두 가지 속성을 뷰 모델에 표시 할 수 있습니다. 그러나 취소 단추를 추가하면 CancelButtonEnabled라는 다른 속성을 추가해야합니다.

프리젠 테이션 로직을 뷰 모델에서 처리해서는 안되기 때문에 이벤트를 추가하는 것이 가장 좋은 해결책 인 것 같습니다.하지만 가장 좋은 방법이나 표준/일반적인 방법은 궁금합니다.

로그인에 성공한 경우 사용자를 이전 페이지로 되돌리려하거나 다른 페이지를보기 모델이나 페이지의 코드 숨김으로 처리해야합니까? 다시 이것이 뷰 모델에 대한 것이 아니라는 것이 확실합니다.

도움 주셔서 감사합니다.

+0

예, 상태 버튼의 새 속성을 추가하는 것이 좋습니다. 이것이 ViewModel을 호출 한 이유입니다. – Daniil

+0

DataTriggers를 사용하여 xaml에서 프리젠 테이션 로직을 처리해 보셨습니까? 복잡한 프리젠 테이션 로직을 사용하는 경우 valueconverters를 사용하여 로직을 처리하고 DataTrigger가 이해할 수있는 값을 반환 할 수 있습니다. – failedprogramming

답변

1

나는 왜 그것이 당신에게 잘못되었다고 확신하지 않지만, 당신의 첫 번째 접근법이 나에게 가장 옳은 것처럼 보입니다. 뷰 모델은 애플리케이션의 상태를 뷰에 정확하게 표시 한 다음 데이터 바인딩을 사용하여 이것이 프레젠테이션으로 변환되는 방식을 제어합니다.

+0

상태 변경을 알리기 위해서는 일반적으로 enum 유형이나 이벤트 속성을 사용하기 때문에 잘못 생각한다고 생각합니다. 내 간단한 상황에 대한 부울 할 것입니다하지만 당신이보기, 편집 및 삽입에 대한 페이지가 있다면 당신은 IsEditing, IsInserting보다는 "보기", "편집"및 "삽입"세 열거 형 값을 가지고 있지만 열거 형을 사용할 수 없습니다 xaml에서 쉽게보기 상태 변경을 처리하는 표준 방법이 있어야한다고 생각했습니다. –

+0

보기 모델이 다른 페이지로 이동해야하거나 페이지의 코드 숨김으로 로그인해야한다면 로그인이 성공한 것은 어떨까요? –

+1

다른 usercontrol로 이동합니다. 애플리케이션을 연결하는 방식이 다를 수 있습니다. 나는 보통 하나의 MainWindow만을 가지고있다. (나는 PopupWindow를 가지고 있지만 괜찮다).내 MainWindow, 내 MainViewModel viewmodel 속성에 연결되어있는 usercontrol 넣어. 화면을 "변경"하려면 MainViewModel에서 viewmodel 속성을 변경합니다. 내 MainWindow (또는 사전)의 DataTemplates가 viewmodel이 변경되었음을 감지하고 다른 usercontrol => 화면 변경을로드합니다. – failedprogramming

관련 문제