example commandmanager wpf mvvm mvvm-light routed-commands eventtocommand

commandmanager - Cuándo usar eventos sobre comandos en WPF?



commandmanager wpf example (2)

Es posible que desee echar un vistazo a esta publicación:

Comandos WPF vs Eventos Ventajas / Desventajas

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 de MVVMLight Toolkit , que le permite adjuntar cualquier evento a un comando en su viewmodel. Muy útil, especialmente si ya estás usando MVVM Light (que recomiendo encarecidamente).

Hola, recientemente analicé WPF y comencé 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".

¿Es posible hacer que el Botón reaccione a cualquier otro evento como el evento MouseOver a través del uso de commnds? ¿O se usarían WPF Events en este caso?

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


Esta es una pregunta justa, y una que es un problema común, pero "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 está el ejemplo del MVVM Light Toolkit.

En resumen, esto le permite mapear un evento a un enlace de comando como ese:

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

Actualizar:

Hay otras dos soluciones "razonables" para este problema:

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

El otro es un poco irritante, pero viable.

  1. Capture un comando a través de un evento puramente en la vista.
  2. Consultar el paso DataSource del control
  3. Toma un identificador de destino vinculante de cadena que denote tu comando (quizás usando una cadena const en la vista)
  4. Invoca tu comando en el modelo de vista a través de la reflexión y pasa 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 enlaces de comandos tradicionales. Para estar seguro de que necesitaría ver el IL, y no creo que importe en este caso.

/Actualizar

Sin embargo, quiero señalar que esta no es siempre una situación ideal. Descubrí que la mayoría de las veces, uso EventToCommand para cubrir un problema de diseño. Por favor considere lo siguiente:

  • Use 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 corresponde, especialmente si se encuentra utilizando comandos para encapsular bevahior impulsado por eventos 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)
  • Es muy probable que EventToCommand se utilice para manejar eventos "tipo Comando" solamente (haciendo doble clic, etc.) y no eventos reactivos (mouse-over). Sin embargo, no hay nada que lo impida. Implemente como mejor le parezca.

Lo más importante tal vez es que recuerdes que eres 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.