2010-06-22 11 views
6

Ho trovato in realtà 2 modi per gestire gli eventi del mouse sui controlli con il modello mvvm.Gestione degli eventi del mouse sui controlli con pattern MVVM - best practice -

Entrambi i metodi sono in realtà 1 via:

MVVM Luce Toolkit da http://mvvmlight.codeplex.com/

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <cmd:EventToCommand 
      Command="{Binding SelectionChangedCommand}" 
      CommandParameter="{Binding SelectedItems, 
       ElementName=MyDataGrid}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

e l'interactivity.dll Miscela con comportamenti

<i:Interaction.Triggers> 
    <i:EventTrigger EventName=”MouseLeftButtonDown”> 
    <Behaviours:ExecuteCommandAction Command=”{Binding MyCommand}” CommandParameter=”{Binding MyCommandParameter}”/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Sapete di qualsiasi metodo migliore?

Moderatore: perché diamine sono le mie ultime 6 righe di codice xaml non visibili affatto? Sono ingoiati da IE e Iron Browser. La prego di segnalare all'amministratore di correggere lo script del codice? non funziona affatto molto spesso. prova: http://img251.imageshack.us/img251/5236/errorxt.png

+0

Il codice StackOverflow deve essere rientrato di quattro spazi per essere riconosciuto come codice e formattato correttamente. Penso che tu non lo sapessi, perché le righe che hai chiesto non erano affatto indentate. Ho modificato la tua domanda per risolvere questo problema. C'è un pulsante nella parte superiore dell'editor che ti consente di indentare rapidamente: è l'icona è tutti e zero. –

+0

Come sempre ho usato il pulsante zero/ones e incollato il codice. – msfanboy

+0

Quindi immagino che qualcosa sia andato storto con il tuo incolla, perché non è finito indentato nella casella di testo di modifica. Non uso più il pulsante zero/ones, quindi ho dimenticato i dettagli di come funziona. –

risposta

8

Questi sono entrambi i modi migliori per farlo se è necessario gestire MouseDown in luoghi arbitrari.

Tuttavia queste situazioni generalmente sono poche e lontane tra loro. Di solito c'è un modo più semplice:

  • Sei sicuro che i tuoi oggetti non siano realmente pulsanti che semplicemente non sembrano pulsanti? Se è così, rendili veri e propri oggetti Button e modellali per apparire nel modo desiderato.
  • Sei sicuro che i tuoi oggetti siano solo aree di selezione per oggetti in un elenco? In tal caso, modificare il contenitore da ItemsControl a ListBox e restyle ListBoxItem per utilizzare le aree di selezione.
  • I tuoi oggetti sono percorsi grafici selezionati? Utilizzare un ToggleButton il cui contenuto è il percorso stesso.

Ci sono molti altri esempi di questo. In effetti, non è raro trovare una situazione in cui MouseDown esegue il mapping a un comando e non esiste un modo più semplice per fare la stessa cosa.

+0

Hai menzionato MouseDown in modo esplicito e spesso, per quanto riguarda i clic del mouse? sono i metodi di cui sopra non va bene per questo? Vedo spesso clic del mouse con comportamenti collegati a mvvm e eventi. Ma quelli che dovrei codificare da soli ... – msfanboy

+1

Come si definiscono i "clic del mouse"? In WPF, questo concetto non esiste realmente. Hai dei clic sui pulsanti, ma non esistono "clic" del mouse: il pulsante del mouse che si abbassa e si riduce sono eventi separati. Per i clic sui pulsanti, non è necessario un modo per associare l'evento Click a un comando perché la classe Button ha già una proprietà Command che è possibile utilizzare direttamente. –

+1

scusa, sembra che i miei frammenti di codice siano fuorvianti: MouseLeftButtonDown Non ho mai voluto parlare di pulsanti ... So che hanno una proprietà Command da associare a ... – msfanboy

7

C'è sempre un'altra opzione. È possibile gestire gli eventi WPF nel code-behind della vista e chiamare il metodo appropriato su ViewModel. Il pattern MVVM non vieta di scrivere alcun codice nel file code-behind della View.

Il ViewModel applicazione di esempio del WPF Application Framework (WAF) mostra come questo può funzionare.

2

XCommand Il progetto codeplex open source ha un modo migliore per gestire questo binding basato su evento/CommandParameter. Trova qui, xcommand.codeplex.com

Ecco il codice di esempio riportato di seguito:

<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 sarà utile.

Problemi correlati