2009-06-26 7 views
26

¿Es posible llamar un comando a través de un evento en WPF?Comandos de llamada de WP a través de eventos

Tengo un botón de guardar que cuando se acepta llamadas de un comando, esto es presionado cuando haya terminado de editar un cuadro de texto, sino que también pasa un objeto como un parámetro de comando

<Button Content="Save" Command="{Binding DataContext.SaveQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}" /> 

Lo que lo ideal sería hacer es llamar a este comando y pasar el objeto como un parámetro cuando el cuadro de texto pierde el foco, en lugar de tener que pulsar el botón, algo así como:

<Button LostFocus="{Binding SaveQueueTimeCommand}" /> 

y todavía alguna manera pasar el objeto como un parámetro. ¿Hay una manera de lograr esto sin usar código subyacente como yo estoy usando el patrón MVVM

Gracias por su tiempo

Respuesta

2

Me temo que no creo que lo que quiere hacer es posible. Los comandos no son delegados, por lo que no puede escribir un comando hasta un evento. Creo que su mejor opción es manejar el evento Button.LostFocus, y luego ejecutar manualmente el comando desde el controlador.

No hay nada de malo en poner código en el código cuando se usa MVVM, es mejor minimizarlo y mantener el código para ver tareas relacionadas solamente. Llamaría a esta vista de código relacionada, por lo que sería encontrar poner el código en el código.

+0

Sí que tiene sentido, gracias por su tiempo :) –

+0

Finalmente, otra respuesta mostró claramente que * es * posible (aunque no en realidad directamente). – SRKX

15

Puede usar comportamientos adjuntos para lograr esto. Marlon Grech ha escrito la biblioteca Attached Command Behaviors para evitarle problemas. El uso se ve así:

<Grid> 
    <local:CommandBehaviorCollection.Behaviors> 
     <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/> 
    </local:CommandBehaviorCollection.Behaviors> 
</Grid> 
56

La forma más sencilla de hacerlo es mediante el uso de un disparador de interacción.

<Grid xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SomeEvent"> 
      <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Grid> 

He agregado esto para posterity sake.

+0

Esto es asombroso. Muchas gracias por la información. – Magus

+5

Tenga en cuenta que http://schemas.microsoft.com/expression/2010/interactivity está en System.Windows.Interactivity.dll que se incluye en Blend SDK. – PeterM

2
<Grid MouseRightButtonDown ="{eb:EventBinding Command=SomeCommand, CommandParameter=$e}"> 

</Grid> 

Comando

{eb:EventBinding} (Simple naming pattern to find Command) 

{eb:EventBinding Command=CommandName} 

CommandParameter

$e (EventAgrs) 

$this or $this.Property 

string 

https://github.com/JonghoL/EventBindingMarkup

Cuestiones relacionadas