2011-01-24 7 views
8

나는이 질문에 많은 읽기 등 MVVM 패턴, RelayCommand, 와 WPF 응용 프로그램을 개발하고 있어요 바인딩하지만 난에 명확하지 않다 :WPF 및 MVVM 이벤트

나는 도형을 이동되고 싶지 모든, 예를 들어, 타원과 같이, 최종 위치를 포착하여 데이터베이스에 저장합니다.

그러나 이벤트 (MouseLetButtonDown, MouseLeftButtonUp 및 MouseMove)를 명령에 바인딩 할 수 없습니다. 첨부 된 비헤이비어에 대해 읽었지만 위치 (MouseButtonEventArgs 및 MouseEventArgs)의 인수가 필요합니다.

해결책?

이 그것을 WPF에서 작동해야하므로 실버 라이트 작동

답변

2

<i:Interaction.Triggers> 
<i:EventTrigger EventName="MouseLeftButtonDown"> 
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
+1

블렌드를 사용하는 것을 잊어 버렸습니다. – TigOldBitties

8

MVVM 그래픽 응용 프로그램을 작성, 당신이 필요로하는 모든 이벤트를 보내려고하는 유혹 (또는 약간의 수정을해야한다 적어도) 뷰 모델로 넘어갑니다. 그러나 명령에서 뷰 특정 마우스 이벤트 args를 처리하는 것은 MVVM 원칙과 느슨한 결합의 목표에 위배됩니다.

이 문제를 해결하려면 뷰를 수행 할 수있는 작업으로 작업을 추상화 한 다음 작업과 데이터를 통해 결과를 뷰 모델에 다시 전달해야합니다. 이를 지원하기 위해 코드 숨김 코드를 약간만 실행하려면 MVVM 경찰이 자녀를 데려 오거나 데려 오지 않습니다. 그러나 더 나은 방법은 상호 작용을 행동에 추가하는 것입니다. 비헤이비어는 MVAM 패턴 및 XAML에 이벤트 처리기를 추가해야하는 상호 작용이 필요한 응용 프로그램에서 잘 작동하는 코드 숨김 기능이없는 재사용 가능한 기능입니다. 뷰 모델이 할 수있는 뷰에 의해 수행하여 상호 작용으로

:

그래픽 객체를 드래그위한 마우스 이벤트를 사용하는 행위의 완전한 예를 들어 여기에 내 대답을 참조하십시오 데이터와 명령을 고수하십시오.

+0

대단히 감사합니다. 내가 필요한 것이었습니다. 이제 MVVM 패턴이 더 잘 이해됩니다. –

0

이 당신이 WPF UIElement에서 상속 어떤 UI 요소에 대한 MouseMove 이벤트, MouseLeftButtonDown과 같은 모든 이벤트의 명령 및 CommandParameter 바인딩 할 수 있습니다, 여기 XCommand 오픈 소스 CodePlex에서 WPF의 확장자 프로젝트, xcommand.codeplex.com을 찾을 수 있습니다.

여기에는 8 개의 응용 프로그램 및 Windows 데스크톱 응용 프로그램 버전의 클래스 라이브러리가 있습니다. WPF 데스크톱 응용 프로그램을 다루는 WPFXCommand를 원합니다. 여기 어떻게 작동하는지. WPFXCommand.dll을 원하는 프로젝트에 대한 참조로 추가하십시오.어떤 UI 요소의 사용 가능한 이벤트은 WPF UIElement에서 같이 상속 이제

xmlns:XCmd="clr-namespace:WPFXCommand;assembly=WPFXCommand" 

, 당신은 명령CommandParameter 바인딩 할 수 있습니다 :

로 아래 XAML 파일에 네임 스페이스를 추가 아래 :

<Grid> 
     <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock" 
       Foreground="{Binding FgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}" 
       XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}" 
       XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"  
       Text="{Binding Description, Mode=TwoWay}"> 
     </TextBlock> 
     <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
       XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}" 
       XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       > 
     </Grid> 
    </Grid> 

희망이 있으면 전자 메일을 제거하는 데 도움이됩니다. 통풍구 기반 코드.