2011-05-23 21 views
29

Hola, he buscado recientemente en WPF y he empezado a aprender sobre eventos y comandos. Normalmente utilizo Comandos al hacer clic en los botones, lo que hace que se ejecute un método en mi "modelo de vista".Cuándo usar eventos sobre comandos en WPF?

¿Es posible hacer que el botón reaccione ante cualquier otro evento como el evento MouseOver mediante el uso de commnds? ¿O se usarían WPF Events en este caso?

Si se van a utilizar eventos WPF, ¿debería la implementación del controlador de eventos simplemente llamar a un método en el modelo de vista para mantener las preocupaciones sperate?

+0

Si aún no lo ha hecho, recomiendo las transmisiones de video MIX y Techday de Laurent Bungion, incluida la excelente transmisión MVVM de inmersión profunda MIX11, que cubre una gran cantidad de estos casos de borde MVVM. – Firoso

Respuesta

13

Esta es una pregunta justa, y que es un problema común, aunque "resuelto" (debatiblemente) dentro del ámbito de la arquitectura MVVM. Si está utilizando un marco de MVVM, es probable que encuentre algo similar al Comportamiento de EventToCommand, here es el ejemplo del MVVM Light Toolkit.

En resumen, esto le permite asignar un evento a una orden vinculante de este 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> 

Actualización:

hay otras dos soluciones "razonables" a este problema:

Uno usa la extensión heredada "AttachedCommandBehavior" ahora considerada here.

El otro es un poco irritante, pero viable.

  1. Capture un comando a través de en evento puramente en la vista.
  2. consulta DataSource del control Paso
  3. Grab una cadena objetivo vinculante identificador que denota su comando (tal vez usando una cadena const en la vista )
  4. Invoque el comando en el modelo de vista a través de pase reflexión y en los argumentos del comando.

Esto parece asqueroso, pero estoy bastante seguro de que en realidad es un poco más rápido que el simple uso de las vinculaciones de comando tradicionales . Para estar seguro de que necesitaría ver el IL, y no creo que importe en este caso.

/actualización

quiero señalar sin embargo que esto no siempre es una situación ideal.Descubrí que la mayoría de las veces, uso EventToCommand para cubrir un problema de diseño. Tenga en cuenta lo siguiente:

  • Utilice eventos y código para manejar los comportamientos relacionados con la interfaz de usuario.
  • Considere la posibilidad de crear controles personalizados que tengan enlaces de comandos si es necesario, especialmente si se encuentra utilizando comandos para encapsular eventos dirigidos por bevahior para establecer datos vinculados que luego se reflejan en la vista. (es decir, establecer un valor de transparencia basado en la proximidad a un control o algo similar)
  • EventToCommand debería utilizarse para manejar eventos "tipo Comando" solamente (haciendo doble clic, etc.) eventos no reactivos (mouse-over). Sin embargo, no hay nada que lo impida. Implemente como mejor le parezca.

Lo más importante tal vez es que recuerde que usted es el desarrollador. Las pautas en sí mismas no resuelven los problemas, pero la consideración de las pautas puede hacer que la solución a un problema sea evidente.

6

Es posible que desee echar un vistazo a este post:

WPF Commands vs Events Advantages/Disadvantages

que habla sobre los diferentes usos de eventos y comandos.

En cuanto a los comandos para otros eventos, debe echar un vistazo a algo como EventToCommand como parte del MVVMLight Toolkit, que le permite adjuntar cualquier evento a un comando en su modelo de vista. Muy útil, especialmente si ya estás usando MVVM Light (que recomiendo encarecidamente).

Cuestiones relacionadas