2011-01-24 20 views
8

Estoy desarrollando una aplicación WPF con el patrón MVVM, RelayCommand, etc. He leído mucho sobre esta cuestión, pero no estoy claro en cuanto a:WPF y MVVM. Encuadernación Eventos

Todo lo que quiero hacer es mover una forma, como una elipse, por ejemplo, y captura su posición final, para poner en la base de datos.

Pero no puedo vincular eventos (MouseLetButtonDown, MouseLeftButtonUp y MouseMove) a los comandos. He leído sobre comportamientos adjuntos, pero necesito los argumentos de los eventos (MouseButtonEventArgs y MouseEventArgs) para recuperar la posición.

¿Solución?

Respuesta

2

Esto funciona para Silverlight por lo que debería funcionar en WPF (o al menos debería, con modificaciones menores)

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

Olvidó mencionar que esto usa Blend – TigOldBitties

8

Al escribir una aplicación gráfica MVVM, es tentador tratar de enviar todos los eventos que necesite a la vista-modelo. Pero el procesamiento de args de evento de mouse específicos de vista en un comando es contrario a los principios de MVVM y el objetivo del acoplamiento suelto.

La manera de resolver este problema es resumir la operación en una tarea que la vista puede realizar y luego comunicar sus resultados al modelo de vista a través de operaciones y datos. Si desea realizar una pequeña cantidad de código en el código subyacente para respaldar esto, la policía de MVVM no vendrá y se llevará a sus hijos. Pero una forma aún mejor es agregar interactividad con comportamientos. Los comportamientos son piezas de funcionalidad reutilizables sin código subyacente que funcionan bien con el patrón MVVM y las aplicaciones que necesitan interactividad que de lo contrario requerirían agregar controladores de eventos a su XAML.

Véase mi respuesta aquí un ejemplo completo de un comportamiento que utiliza los eventos del ratón para arrastrar objetos gráficos:

Con su interactividad realizado por la vista, la vista-modelo puede apegarse a datos y comandos.

+0

Muchas gracias, era justo lo que necesitaba. Ahora entiendo mejor el patrón MVVM. –

0

puede encontrar XCommand abierta proyecto WPF extensión de codeplex fuente aquí, xcommand.codeplex.com, esto le permite enlazar comandos y CommandParameter de cualquier evento como MouseMove, MouseLeftButtonDown a cualquier elemento de interfaz de usuario que hereda de UIElement WPF.

Aquí puede encontrar la aplicación de Windows 8 y la versión de la aplicación de escritorio de Windows de las bibliotecas de clases. Desea que WPFXCommand se ocupe de la aplicación de escritorio WPF. Aquí, cómo funciona. Agregue WPFXCommand.dll como referencia a su proyecto deseado.

Añadir el espacio de nombres en su archivo XAML de la siguiente manera:

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

Ahora, puede enlazar Comando y CommandParameter a eventos disponibles en cualquier elemento de la interfaz de usuario heredan de WPF UIElement como a continuación:

<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> 

Espero que esto te ayude a deshacerte de e código basado en ventilación detrás.