2011-10-24 21 views
15

Qual è il modo migliore per associare un evento WPF nella vista a ViewModel?Associazione eventi WPF da View a ViewModel?

Ho ottenuto un evento di rilascio nella vista ma desidero sostituirlo con il binding di ViewModel. Trovato diverse soluzioni ma nessuna di esse ha fatto ciò che mi aspettavo.

Vista Codice:

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

Imo vincolante un evento a un ViewModel è mai una buona idea. Ovviamente dipende da come vuoi che MVVM funzioni per te, ma separiamo strettamente gli eventi, che sono la logica ui, e i comandi che sono la logica aziendale. Volevo solo aggiungere questo :) alla fine dipende molto da come e cosa vuoi ottenere. – dowhilefor

+0

Grazie, bel commento terrò a mente. Per ora voglio solo che il codice dietro i file sia vuoto. Ma da tutte le cose che ho letto hai ragione;) – jefsmi

+0

@dowhilefor è una risposta da sola - e buona. Ti suggerisco di scrivere qualcosa. :) – ANeves

risposta

37

Un modo per gestire gli eventi in MVVM e XAML è quello di utilizzare le funzionalità Miscela interattività. Questo spazio dei nomi contiene le classi InvokeCommandAction e CallMethodAction.

InvokeCommandAction consente di associare qualsiasi evento a un comando del modello di visualizzazione mentre CallMethodAction consente di associare qualsiasi evento a un metodo del modello di visualizzazione.

Per esempio, se si desidera associare l'evento DoubleClick di un pulsante per un comando di visualizzazione modello si dovrebbe fare in questo modo:

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

e dichiarando questo spazio dei nomi:

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

Tutto quello che è necessario fare riferimento nei tuoi progetti è installare Expression Blend o Expression Blend SDK.

3

Beh un modo per farlo è quello di convertire tale evento in un comando e poi si legano al presentatore di comando, vale a dire attraverso la definizione di un comportamento evento.

Vedere questo, WPF Event Binding to ViewModel (for non-Command classes)

+0

Ho trovato la soluzione EventToCommand ma non ne sono molto entusiasta, quindi volevo sapere se c'erano modi migliori per risolvere questo problema ma grazie;) – jefsmi

+1

:) puoi provare la soluzione di proprietà allegata se ti va bene – whoisthis

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

</Button> 

Comando

{eb: EventBinding} (modello di denominazione semplice per trovare Command)

{eb: EventBinding Comando = CommandName}

CommandParameter

$ e (EventAgrs)

$ questo o $ this.Property

stringa

https://github.com/JonghoL/EventBindingMarkup

Problemi correlati