2010-12-10 26 views
2

Je sais que vous l'utiliserez pour invoquer la méthode sur le ViewModel, mais juste par curiosité, comment utiliseriez-vous pour câbler un gestionnaire d'événements sur l'instance de la vue, ce qui équivaut à le câblage dans le code derrière.CallMethodAction: Comment faire référence à l'instance d'une vue comme étant TargetObject

+0

Demandez-vous comment vous auriez la méthode invoquée en réponse à un événement _or_ comment vous invoquer une gestionnaire d'événements en tant que méthode? – AnthonyWJones

+0

@AnthonyWJones: Il existe une propriété TargetObject sur CallMethodAction. Je dois me référer à l'instance de la vue où se trouve ce déclencheur. J'ai pu me référer au nom du contrôle utilisateur, mais cela me donne une erreur de référence nulle. – epitka

Répondre

1

Je pense que vous êtes probablement après quelque chose comme ceci (ignorer que cet exemple spécifique est mieux fait avec une commande).

<Button Content="Click this"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
     <ei:CallMethodAction TargetObject="{Binding}" MethodName="SomeMethod" /> 
     </i:EventTrigger>   
    </i:Interaction.Triggers> 
</Button> 
+1

Cela ne fonctionne pas: la syntaxe de liaison vide fait référence au contexte de données actuel de la vue, pas à la vue elle-même. Dans un scénario MVVM, cela vous amène dans la VM. –

3

Le TargetObject est l'objet qui a la méthode à appeler, si vous avez la méthode dans votre fenêtre de code derrière l'objet est la fenêtre elle-même. Vous pouvez lier à elle par son nom:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
      ...etcetera... 
      x:Name="UserControl"> 

Ainsi, votre CallMethodAction serait:

<ei:CallMethodAction MethodName="MyMethod" 
        TargetObject="{Binding ElementName=UserControl, Mode=OneWay}"/>