2011-01-24 22 views
8

Sto sviluppando un'applicazione WPF con il modello MVVM, RelayCommand, ecc ho letto molto su questa domanda, ma non mi è chiaro come a:WPF e MVVM. Binding Eventi

Tutto quello che voglio fare è spostare una forma, come un'ellisse, ad esempio, e catturare la sua posizione finale, per inserire il database.

Ma non è possibile associare gli eventi (MouseLetButtonDown, MouseLeftButtonUp e MouseMove) ai comandi. Ho letto sui comportamenti collegati, ma ho bisogno degli argomenti degli eventi (MouseButtonEventArgs e MouseEventArgs) per recuperare la posizione.

Soluzione?

risposta

2

Questo funziona per Silverlight così dovrebbe funzionare su WPF (o almeno dovrebbe con piccole modifiche)

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

Hai dimenticato di dire che questo usa Miscela – TigOldBitties

8

Quando si scrive un'applicazione grafica MVVM, si è tentati di provare a inviare tutti gli eventi necessari sopra al modello di vista. Tuttavia, l'elaborazione di argomenti evento del mouse specifici della vista in un comando è contraria ai principi MVVM e all'obiettivo dell'allentamento.

Il modo per risolvere questo problema è di astrarre l'operazione in un'attività che la vista può eseguire e quindi di comunicare i suoi risultati al modello di vista tramite operazioni e dati. Se vuoi eseguire una piccola quantità di codice nel code-behind per supportare questo, la polizia MVVM non verrà e prenderà i tuoi figli. Ma un modo ancora migliore è aggiungere l'interattività con i comportamenti. I comportamenti sono funzionalità riutilizzabili senza code code che funzionano bene con il pattern MVVM e le applicazioni che richiedono l'interattività che altrimenti richiederebbe l'aggiunta di gestori di eventi al proprio XAML.

Vedere la mia risposta qui per un esempio completo di un comportamento che utilizza gli eventi del mouse per trascinare gli oggetti grafici:

Con la vostra interattività eseguito dalla vista, il modello View può attenersi a dati e comandi.

+0

Grazie mille, era proprio quello di cui avevo bisogno. Ora capisco meglio il pattern MVVM. –

0

Potete trovare XCommand open source CodePlex progetto WPF estensione qui, xcommand.codeplex.com, questo consente di associare comando e CommandParameter di eventuali eventi come MouseMove, MouseLeftButtonDown a qualsiasi elementi dell'interfaccia utente che eredita da WPF UIElement.

Qui è possibile trovare l'applicazione di Windows Store 8 e la versione dell'applicazione desktop di Windows delle librerie di classi. Vuoi WPFXCommand che si occupa dell'applicazione desktop WPF. Ecco come funziona. Aggiungi WPFXCommand.dll come riferimento al tuo progetto di desiderio.

Aggiungere lo spazio dei nomi nel file XAML, come di seguito:

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

Ora, è possibile associare Comando e CommandParameter a tutti gli eventi disponibili su tutti gli elementi dell'interfaccia utente ereditano da WPF UIElement come sotto:

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

Spero che questo ti aiuti a sbarazzarti di e codice basato sullo sfiato.