2010-04-02 2 views
2

패턴에 따라 ViewModel은 속성이 (변경 알림과 함께) 공개되고 명령이 (사용자 액션을 VM에 알리기 위해) 뷰를 바인딩한다는 것을 나타냅니다. VM에서 View로 전달되는 유일한 통신은 속성 변경 알림 (보기가 업데이트 된 데이터로 자체를 새로 고칠 수 있도록)입니다.ViewModel에서 View w.r.t.의 메소드를 호출해야하는 시나리오가 있습니까? WPF에서 MVVM?

MVP 또는 PresentationModel 형태의 패턴 (실수하지 않은 경우)에서 View는 메소드, 속성 및 이벤트로 구성된 일반 바닐라 인터페이스를 구현합니다. MVVM을 사용하면 IView에 대한 메소드가 (IView 자체와 함께) 불법화 된 것으로 느낍니다.

내가 생각할 수있는 시나리오 중 하나는보기의 특정 컨트롤에 포커스를 설정하는 것이 었습니다. (사용자가 ActionX를 실행하면 포커스는 즉시 FieldY으로 설정되어야합니다.

  • MVP, 난 발표자 또는 PM이 호출 할 IView.ActivateField (NameConstant)로이 쓰기 것입니다.
  • MVVM에서이 코드는 해결 방법/약간의 코드 숨김이 필요한 프린지 케이스 인 것 같습니다. VM는 ActiveCield 속성을 구현하며이 속성은 NameConstant로 설정됩니다. 뷰는 변경 알림 이벤트를 선택하고 코드 숨김 이벤트 핸들러에서 Name 컨트롤을 활성화합니다.

위의 내용은 표준에 대한 예외입니까? 또는 VM이보기에서 메소드를 호출해야하는 다른 시나리오가 있습니까?

+0

MVVM은 프리젠 테이션 모델 패턴의 전문화이므로 두 번째 단락에서 작성한 내용을 검토해야한다고 생각합니다. – Bermo

답변

1

ViewModel이보기에서 실제 메소드를 호출하는 것은 바람직하지 않지만보기 조치를 호출 할 수있는 것이 유익합니다. 대부분의 MVVM 실무자는 mediator pattern을 사용하여 메시징 시스템을 옹호하여 VM을 처리하여 통신을보고, MvvmFoundation과 같은 MVVM 프레임 워크를 살펴보면 이러한 메신저 시스템의 예를 종종 볼 수 있습니다.

저는 직접 포커스를 사용하여 가장 일반적인 상황을 발견했습니다. XAML로 올바른 요소에 중점을 두는 것이 설정에 어려움을 겪을 수 있으며 수행 할 수 있습니다. 간단한 것 ...

Messenger.Notify("SetFocusOnElement"); 

매우 편리 할 수 ​​있습니다.

0

코드 숨김을 사용하도록 강요 당하면 XAML에서 선언적으로 사용할 수있는 범용, 재사용 가능한 컨트롤 또는 클래스를 만드는 방식으로 코드 숨기기를 리팩토링 할 수 있습니다. 이 방법은 당신을 도울 수 있다면

<TextBox Text="{Binding SomeStuff}" myCtl:FocusListener.FocusWhen="{Binding SomeStuff}" /> 

그것은 확실히 시나리오에 따라 달라집니다 : 당신이 쓸 수 있도록 귀하의 경우에, 당신은 당신의 자신의 FocusListener 클래스 등으로 올 수 있습니다.

사용 가능한 클래스와 컨트롤을 자신의 일부로 확장하는 것이 반드시 금지 된 것은 아닙니다.

0

인터페이스를 통해보기와 통신하기 위해 MVVM 패턴에서 허용하면 안되는 이유는 무엇입니까?

MVP에서는 발표자 또는 PM이 호출 할 IView.ActivateField (NameConstant)로 작성했습니다.

인터페이스 접근 방식이 간단하고 단점 (예 : 테스트 가능성)을 제공하지 않으면 복잡한 해결 방법을 구현하기 시작하지 않을 것입니다.

자세한 내용은 WPF Application Framework (WAF)입니다.

관련 문제