canexecute Quando utilizzare gli eventi sui comandi in WPF?




wpf binding event to command (2)

Ciao ho recentemente esaminato il WPF e ho iniziato a conoscere Eventi e Comandi. Generalmente utilizzo i comandi sui clic del pulsante che fanno funzionare un metodo nel mio "modello di visualizzazione".

È possibile far reagire il pulsante a qualsiasi altro evento come l'evento MouseOver attraverso l'uso di Commnds? O sarebbe WPF Eventi essere utilizzato in questo caso?

Se gli eventi WPF devono essere utilizzati, l'implementazione del gestore di eventi deve semplicemente chiamare un metodo nel modello di visualizzazione per mantenere le preoccupazioni sperate?


Answer #1

Potresti dare un'occhiata a questo post:

WPF Comandi vs Eventi Vantaggi / Svantaggi

che parla dei diversi usi di eventi e comandi.

Per quanto riguarda i comandi per altri eventi, dovresti dare un'occhiata a qualcosa come EventToCommand come parte di MVVMLight Toolkit , che ti consente di allegare qualsiasi evento a un comando nel tuo viewmodel. Abbastanza utile, specialmente se stai già utilizzando MVVM Light (che consiglio vivamente).


Answer #2

Questa è una domanda giusta, che è un problema comune, ma "risolto" (debatably) all'interno del regno dell'architettura MVVM. Se si utilizza un framework MVVM, è probabile che si trovi qualcosa di simile a EventToCommand Behaviour, here il campione da MVVM Light Toolkit.

In breve, questo ti permette di mappare un evento a un comando di binding in questo modo:

<Rectangle Fill="White"
       Stroke="Black"
       Width="200"
       Height="100">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <cmd:EventToCommand Command="{Binding TestCommand,
                                      Mode=OneWay}"
           CommandParameter="{Binding Text,
                              ElementName=MyTextBox,
                              Mode=OneWay}"
           MustToggleIsEnabledValue="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>

Aggiornare:

Esistono altre due soluzioni "ragionevoli" per questo problema:

Uno usa l'estensione "AttachedCommandBehavior" legacy ora considerata here.

L'altro è un po 'irritante, ma fattibile.

  1. Cattura un comando tramite un evento puramente nella vista.
  2. Interroga il passo DataSource del controllo
  3. Prendi un identificatore di destinazione che lega la stringa che denota il tuo comando (magari usando una stringa const sulla vista)
  4. Richiama il comando sul modello di vista tramite riflessione e passa gli argomenti del comando.

Questo sembra grossolano, ma sono abbastanza sicuro che è in realtà un po 'più veloce rispetto all'utilizzo dei tradizionali binding di comandi. Per essere sicuro avrei bisogno di vedere l'IL, e non penso che sia importante in questo caso.

/Aggiornare

Voglio sottolineare, tuttavia, che questa non è sempre una situazione ideale. Ho scoperto che il più delle volte, sto usando EventToCommand per coprire un problema di progettazione. Si prega di considerare quanto segue:

  • Utilizzare gli eventi e il codice dietro per gestire i comportamenti relativi all'interfaccia utente.
  • Prendi in considerazione la possibilità di creare controlli personalizzati che dispongono di collegamenti dei comandi, se appropriato, specialmente se ti trovi a usare i comandi per incapsulare bevahior gestito da eventi per impostare i dati associati che si riflettono nella vista. (cioè impostando un valore di trasparenza basato sulla prossimità a un controllo o qualcosa di simile)
  • EventToCommand dovrebbe molto probabilmente essere utilizzato per gestire solo eventi "tipo comando" (doppio clic, ecc.) E non eventi reattivi (passaggio del mouse). Tuttavia non c'è nulla che impedisca questo. Implementa come meglio credi.

La cosa più importante forse è che ti ricordi di essere lo sviluppatore. Le linee guida di per sé non risolvono i problemi, ma la considerazione delle linee guida può rendere evidente la soluzione a un problema.





eventtocommand