Quelqu'un sait-il comment je peux forcer CanExecute
pour être appelé sur une commande personnalisée (Josh Smith's RelayCommand
) ?
Typiquement, CanExecute
est appelé à chaque fois qu'une interaction se produit sur l'interface utilisateur. Si je clique sur quelque chose, mes commandes sont mises à jour.
Je suis dans une situation où la condition pour CanExecute
est activé/désactivé par une minuterie en coulisses. Parce que ce n'est pas dirigé par l'interaction de l'utilisateur, CanExecute
n'est pas appelé avant que l'utilisateur n'interagisse avec l'interface utilisateur. Le résultat final est que mon Button
reste activé/désactivé jusqu'à ce que l'utilisateur clique dessus. Après le clic, il est mis à jour correctement. Parfois, le Button
apparaît activé, mais lorsque l'utilisateur clique, il devient désactivé au lieu de s'activer.
Comment puis-je forcer une mise à jour dans le code lorsque le timer change la propriété qui affecte CanExecute
? J'ai essayé d'allumer PropertyChanged
( INotifyPropertyChanged
) sur la propriété qui affecte CanExecute
mais cela n'a pas aidé.
Exemple XAML :
<Button Content="Button" Command="{Binding Cmd}"/>
Exemple de code derrière :
private ICommand m_cmd;
public ICommand Cmd
{
if (m_cmd == null)
m_cmd = new RelayCommand(
(param) => Process(),
(param) => EnableButton);
return m_cmd;
}
// Gets updated from a timer (not direct user interaction)
public bool EnableButton { get; set; }
0 votes
Avez-vous essayé d'élever INotifyPropertyChanged pour la commande ? Il n'est pas nécessaire d'avoir un champ pour la commande, il suffit de renvoyer un nouveau champ à chaque fois. Cette combinaison devrait fonctionner. Ou créez une nouvelle commande uniquement pour le cas où vous avez besoin du forçage.