Выполнение команды viewmodels при вводе в TextBox - PullRequest
51 голосов
/ 05 августа 2010

Я хочу выполнить команду в моей модели представления, когда пользователь нажимает ввод в TextBox.Команда работает, когда привязана к кнопке.

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

Но я не могу заставить ее работать из TextBox.Я попробовал привязку ввода, но она не сработала.

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

Я также попытался установить рабочую кнопку по умолчанию, но она не запускается при нажатии Enter.

Спасибо за вашу помощь.

Ответы [ 5 ]

138 голосов
/ 14 января 2014

Я знаю, что опаздываю на вечеринку, но я заставил это работать на меня.Попробуйте использовать Key="Return" вместо Key="Enter"

Вот полный пример

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

Убедитесь, что в привязке используется UpdateSourceTrigger=PropertyChanged, иначе свойство не будет обновлено, пока фокуспотерян, и нажатие Enter не потеряет фокус ...

Надеюсь, это было полезно!

13 голосов
/ 11 июля 2011

Возможно, вы сделали команду не свойством, а полем. Это работает только для привязки к свойствам. Измените свой AddCommand на свойство, и оно будет работать. (Ваш XAML отлично работает для меня со свойством вместо поля для команды -> никакой код не нужен!)

5 голосов
/ 10 ноября 2010

Вот прикрепленное свойство зависимости, которое я создал для этого. Он имеет преимущество, заключающееся в том, что текстовая привязка обновляется обратно до ViewModel до запуска команды (полезно для silverlight, который не поддерживает триггер источника обновленных свойств).

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);
            }
        };
    }
}

Вы используете это так:

<TextBox 
    Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"/>
3 голосов
/ 19 февраля 2015

Вам необходимо определить жест вместо свойства Key связывания ключей:

<TextBox.InputBindings>
    <KeyBinding Gesture="Enter" Command="{Binding AddCommand}"/>
</TextBox.InputBindings>
0 голосов
/ 22 сентября 2015

В дополнение к ответу Mark Heath я продвинулся на один класс дальше, реализовав свойство присоединенного параметра команды таким образом;

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);
                }
            };
        }
    } 

Использование:

<TextBox Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"
    my:EnterKeyHelpers.EnterKeyCommandParam="your parameter"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...