2013-10-23 4 views
2

나는 사용자가 취하는 동작이 마우스 커서의 위치와 강하게 연관되어있는 그리기 화면이있는 응용 프로그램을 가지고 있습니다. 예를 들어 붙여 넣기를 구현하려고한다고 가정 해 보겠습니다. 이 경우 붙여 넣은 데이터는 사용자의 예상에 따라 뷰포트의 중앙에 대략 배치해야합니다.MVVM 모델에서 마우스 위치 종속 동작이 어떻게 발생합니까?

그러나 "뷰포트"와 같은 개념은 뷰 관심사이며 뷰 모델 관심사는 아닙니다. 그러나 붙여 넣기 작업은 뷰 모델 관심사가 아닌 관심사입니다.

이 시나리오는 MVVM 시스템을 위해 어떻게 설계되어야합니까? 당신이 (있는 당신이 Mode=OneWayToSource을 사용) 결합 수있는 마우스 위치 속성이 없기 때문에

답변

3

, 당신은 MouseMove 이벤트를 수신 할 수 :

private void OnMouseMove(object sender, MouseEventArgs e) 
    { 
     myViewModel.MousePosition = e.GetPosition(this); 
    } 

를 당신이 코드 숨김 사용하기 때문에 그 MVVM이 아니라고하기 전에 어떤 경우 http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

에서 코드 숨김은 복잡한 애니메이션 또는 WH로서에서는 XAML (Extensible Application Markup Language)에 표현하기 어렵고 비효율적 시각적 동작을 구현 UI 로직 코드를 포함 할 수있다 코드는 뷰의 일부인 시각적 요소를 직접 조작해야합니다. 단위 테스트에 필요한 논리 코드를 뷰에두면 안됩니다. 일반적으로보기의 코드 숨김에있는 논리 코드는 UI 자동화 테스트 방법을 통해 테스트됩니다.

으로 다른 방법은 전화 당신의 ViewModel의 방법으로 이벤트 호출을 결합하는 CallMethodAction를 사용할 수 지적 : 내가 사용하지 않으 그러나

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity 
xmlns:ei="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactions 


<i:Interaction.Triggers> 
    <i:EventTrigger EventName="MouseMoved"> 
     <ei:CallMethodAction TargetObject={Binding} MethodName="OnMouseMoved"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

상기 이벤트로 여기 바인딩 것 매우 자주 제기되고 바인딩에는 더 많은 오버 헤드가 필요합니다.

+0

또는 CallMethodAction과 함께 이벤트 트리거를 사용할 수 있습니까? 적어도 마우스 이벤트를 뷰 모델로 전송합니다. – McGarnagle

+0

저는이 모든 것을 "모든 코드가 뷰 모델에 있어야합니다"라고 확신하지 않습니다. 결국 버튼과 친구들이 어떻게 구현되는지가 아닙니다. 어느 쪽의 해결책이라도 좋게 보인다. 감사! +1은 지금 당장은 다른 답변이 게시되는지 궁금합니다. –