web-dev-qa-db-fra.com

Exécution de la commande viewmodels à l’entrée dans la zone de texte

Je souhaite exécuter une commande dans mon modèle de vue lorsque l'utilisateur appuie sur Entrée dans une zone de texte . La commande fonctionne lorsqu'elle est liée à un bouton.

<Button Content="Add" Command="{Binding Path=AddCommand}" />

Mais je ne peux pas le faire fonctionner à partir de la zone de texte .J'ai essayé une Inputbinding, mais cela n'a pas fonctionné.

<TextBox.InputBindings>
    <KeyBinding Command="{Binding Path=AddCommand}" Key="Enter"/>
</TextBox.InputBindings>

J'ai également essayé de définir le bouton de travail par défaut, mais il n'est pas exécuté lorsque vous appuyez sur Entrée.

Merci de votre aide.

51
Marks

Je sais que je suis en retard à la fête, mais ça a fonctionné pour moi. Essayez d'utiliser Key="Return" au lieu de Key="Enter"

Voici l'exemple complet

<TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding AddCommand}" Key="Return" />
    </TextBox.InputBindings>
</TextBox>

Veillez à utiliser UpdateSourceTrigger=PropertyChanged dans votre liaison, sinon la propriété ne sera pas mise à jour tant que la focalisation ne sera pas perdue, et appuyer sur Entrée ne perdra pas la focalisation ...

J'espère que cela a été utile!

137
mkamioner

Vous n'avez probablement pas fait de la commande une propriété, mais un champ. Cela ne fonctionne que pour se lier aux propriétés. Changez votre AddCommand en une propriété et cela fonctionnera. (Votre XAML fonctionne bien pour moi avec une propriété plutôt qu'un champ pour la commande -> aucun code n'est nécessaire derrière!)

13
Andreas Zita

Voici une propriété de dépendance attachée que j'ai créée pour cela. Il présente l'avantage de garantir que votre liaison de texte est mise à jour dans le ViewModel avant le lancement de la commande (utile pour silverlight qui ne prend pas en charge le déclencheur de la propriété de mise à jour de la propriété modifiée).

public static class EnterKeyHelpers
{
    public static ICommand GetEnterKeyCommand(DependencyObject target)
    {
        return (ICommand)target.GetValue(EnterKeyCommandProperty);
    }

    public static void SetEnterKeyCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(EnterKeyCommandProperty, value);
    }

    public static readonly DependencyProperty EnterKeyCommandProperty =
        DependencyProperty.RegisterAttached(
            "EnterKeyCommand",
            typeof(ICommand),
            typeof(EnterKeyHelpers),
            new PropertyMetadata(null, OnEnterKeyCommandChanged));

    static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        ICommand command = (ICommand)e.NewValue;
        FrameworkElement fe = (FrameworkElement)target;
        Control control = (Control)target;
        control.KeyDown += (s, args) =>
        {
            if (args.Key == Key.Enter)
            {
                // make sure the textbox binding updates its source first
                BindingExpression b = control.GetBindingExpression(TextBox.TextProperty);
                if (b != null)
                {
                    b.UpdateSource();
                }
                command.Execute(null);
            }
        };
    }
}

Vous l'utilisez comme ceci:

<TextBox 
    Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"/>
5
Mark Heath

Vous devez définir un geste au lieu de la propriété Key du KeyBinding:

<TextBox.InputBindings>
    <KeyBinding Gesture="Enter" Command="{Binding AddCommand}"/>
</TextBox.InputBindings>
2
Ashot Muradian

En plus de la réponse de Mark Heath , j'ai poussé la classe un peu plus loin en implémentant la propriété jointe Param Param

public static class EnterKeyHelpers
{
        public static ICommand GetEnterKeyCommand(DependencyObject target)
        {
            return (ICommand)target.GetValue(EnterKeyCommandProperty);
        }

        public static void SetEnterKeyCommand(DependencyObject target, ICommand value)
        {
            target.SetValue(EnterKeyCommandProperty, value);
        }

        public static readonly DependencyProperty EnterKeyCommandProperty =
            DependencyProperty.RegisterAttached(
                "EnterKeyCommand",
                typeof(ICommand),
                typeof(EnterKeyHelpers),
                new PropertyMetadata(null, OnEnterKeyCommandChanged));


        public static object GetEnterKeyCommandParam(DependencyObject target)
        {
            return (object)target.GetValue(EnterKeyCommandParamProperty);
        }

        public static void SetEnterKeyCommandParam(DependencyObject target, object value)
        {
            target.SetValue(EnterKeyCommandParamProperty, value);
        }

        public static readonly DependencyProperty EnterKeyCommandParamProperty =
            DependencyProperty.RegisterAttached(
                "EnterKeyCommandParam",
                typeof(object),
                typeof(EnterKeyHelpers),
                new PropertyMetadata(null));

        static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            ICommand command = (ICommand)e.NewValue;
            Control control = (Control)target;
            control.KeyDown += (s, args) =>
            {
                if (args.Key == Key.Enter)
                {
                    // make sure the textbox binding updates its source first
                    BindingExpression b = control.GetBindingExpression(TextBox.TextProperty);
                    if (b != null)
                    {
                        b.UpdateSource();
                    }
                    object commandParameter = GetEnterKeyCommandParam(target);
                    command.Execute(commandParameter);
                }
            };
        }
    } 

Usage:

<TextBox Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"
    my:EnterKeyHelpers.EnterKeyCommandParam="your parameter"/>
0
T.Y. Kucuk