2011-10-24 25 views
15

¿Cuál es la mejor manera de enlazar un evento WPF en la Vista con el modelo de vista?WPF vinculante de eventos de Ver a ViewModel?

Recibí un evento de soltar en mi Vista, pero quiero reemplazarlo por el enlace debido de ViewModel. Encontré varias soluciones, pero ninguna de ellas hizo lo que yo consideré.

Ver código:

<TextBox 
    AllowDrop="True" 
    PreviewDrop="email_Drop" /> 
+4

Imo unirse a un evento a un modelo de vista nunca es una buena idea. Bueno, por supuesto, depende de cómo quiera que MVVM trabaje para usted, pero separamos estrictamente Eventos, que son lógica de UI, y comandos que son lógica de negocios. Solo quería agregar esto :) al final depende mucho de cómo y qué quieres lograr. – dowhilefor

+0

Gracias, buen comentario lo tendré en cuenta. Por ahora solo quiero que el código detrás de los archivos esté vacío. Pero de todas las cosas que leí, tiene razón;) – jefsmi

+0

@dowhilefor eso es una respuesta en sí misma, y ​​una buena. Te sugiero que escribas algo. :) – ANeves

Respuesta

37

Una manera de manejar eventos en MVVM y XAML es utilizar las características de mezcla interactividad. Este espacio de nombres contiene las clases InvokeCommandAction y CallMethodAction.

InvokeCommandAction le permite vincular cualquier evento a un comando view-model mientras que CallMethodAction le permite vincular cualquier evento a un método de modelo de vista.

Por ejemplo, si desea enlazar el evento de DoubleClick de un botón a un comando de vista-modelo que lo haría así:

<Button> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

y la declaración de este espacio de nombres:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

Todo lo necesidad de referencia en sus proyectos es instalar Expression Blend o Expression Blend SDK.

3

bien una forma de hacerlo es convertir ese evento en un comando y luego se unen al presentador de mando, es decir, mediante la definición de comportamiento de un evento.

ver esto, WPF Event Binding to ViewModel (for non-Command classes)

+0

Encontré la solución EventToCommand pero no soy muy fanático de ella, así que quería saber si había mejores formas de resolver esto, pero gracias;) – jefsmi

+1

:) puede probar la solución de propiedad adjunta si le conviene – whoisthis

1
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}"> 

</Button> 

Comando

{eb: EventBinding} (patrón de nomenclatura simple para encontrar Comando)

{eb: EventBinding Comando = CommandName}

CommandParameter

$ e (EventAgrs)

$ o $ this.Property este

cadena

https://github.com/JonghoL/EventBindingMarkup