0

Je suis un peu confus au sujet de ICommand et RelayCommandQuand utiliser ICommand enveloppé avec RelayCommand et quand utiliser Just ReplayCommand?

Si je le fais sur un contrôle de saisie semi-automatique

public RelayCommand<KeyEventArgs> AutoCompleteCommand 
{ 
    get; 
    private set; 
} 

public MyConstructor() 
{   
    AutoCompleteCommand = new RelayCommand<KeyEventArgs>((e) => 
    { 
     //Check if the key pressed is <Enter> 
     //if it is, check also if the SearchPropertyValue is not String.Empty then 
     var d = e; 

     //Should it return true or false?      
    }); 
} 

Dans le XAML:

<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0" VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162"/> 


<i:Interaction.Triggers> 
    <i:EventTrigger EventName="KeyDown"> 
     <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoCompleteCommand, Mode=OneWay}" PassEventArgsToCommand="True"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Rien ne se passe.

Si je fais

public ICommand AutoComplete 
{ 
    get 
    { 
     return new RelayCommand<KeyEventArgs>(e => 
     { 
      var key = e.Key; 
     }); 
    } 
} 

Dans le XAML:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="KeyDown"> 
     <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding AutoComplete, Mode=OneWay}" 
      PassEventArgsToCommand="True"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

<toolkit:AutoCompleteBox x:Name="acbStore" Margin="154,196,29,0" 
    VerticalAlignment="Top" RenderTransformOrigin="0.6,0.083" Height="162"/> 

Il fonctionne et ma commande est déclenchée.

De tous les exemples que j'ai vus, RelayCommand semble toujours aller dans le constructeur. Puis-je le coller ailleurs car cela va rendre le constructeur très encombré.

+1

Vous ne liez pas la commande dans votre premier échantillon afin qu'il ne se déclenche pas. Que vous utilisiez 'ICommand' ou' RelayCommand <> 'vous devez toujours le lier dans votre xaml. –

+0

RelayCommand est un objet comme les autres. Vous pouvez l'instancier où vous voulez, mais il doit être instancié, et il doit être lié à votre XAML quelque part. – LBugnion

+0

@AlaaMasoud - Désolé, il est effectivement là mais je suppose que je ne l'ai pas mis en évidence avec le "formateur de code" donc il n'a pas été montré. – chobo2

Répondre

0

En ce qui concerne le problème, les deux devraient fonctionner vraiment. (un des commentaires a dit que ce n'est pas lié dans le premier exemple, mais votre code le suggère.) En tout cas, la seconde approche renvoie un nouvel appel, ce qui sent le un peu pour être honnête ...

a propos de l'endroit où le faire, vous pouvez le faire de toute façon que je l'ai vu 2 approches principales:.

Première option:
Avoir un ICommand privé comme propriété, et le définir dans Constructeur:

ctor { 
    Cool_Command = new RelayCommand<EventArgs>(Execute_CoolCommand, 
               CanExecute_CoolCommand);  
} 

public ICommand Cool_Command { get; private set; } 

Deuxième option:
Avoir comme propriété qui est définie la première fois que cela s'appelle. En ce qui concerne ce qui est mieux: Quels sont plus jolis, rousses ou blonds? :)

Questions connexes