Как передать текстовое поле KeyEventArgs и значение текстового поля в команде wpf - PullRequest
0 голосов
/ 07 апреля 2019

Я борюсь с тем, что у меня есть текстовое поле

<TextBox Name="FilterInputText" Visibility="{Binding VisibiltyAttr}" Width="500" Height="30" Text="{Binding InputText}" HorizontalAlignment="Left" Margin="5">
                    <TextBox.InputBindings>
                        <KeyBinding Command="{Binding EnterCommand}" Key="Enter" />
                        <KeyBinding Command="{Binding DownSelectionCommand}" Key="Down" />
                    </TextBox.InputBindings>
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="KeyUp">
                            <i:InvokeCommandAction  Command="{Binding CompleteCommand}"  CommandParameter="{Binding Text, ElementName=InputText}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </TextBox> 

У меня есть событие, инициируемое здесь с чем-то, вводимым внутри текстового поля с событием "KeyUp".Теперь я работаю для автозаполнения текстового поля, поэтому я показал предложения по вводу в список, который работает нормально.поэтому мне нужно привязать клавишу вниз, чтобы связать с этим текстовым полем, чтобы после показа предложений пользователь мог нажать клавишу вниз и выбрать оттуда свой желаемый вариант.Это будет хорошо работать для связывания клавиш для клавиши вниз.

Проблема связана с активацией события, потому что любое нажатие клавиши внутри текстового поля вызывает это событие.теперь я отправляю значение текстового поля в качестве параметра команды, но мне также нужно отправить keyeventargs с параметром comamnd, чтобы я мог выяснить, какая клавиша нажата, и когда нажата кнопка «вниз», я больше не буду выполнять метод.

Так как я могуя передаю и значение текстового поля, и keyeventargs в качестве параметра команды, я строго следую образцу mvvm.

1 Ответ

0 голосов
/ 10 апреля 2019

По умолчанию InvokeCommandAction передает аргументы события, если не указан параметр команды.Кроме того, текстовое поле привязано к свойству в вашей модели представления.Итак, если вы измените код следующим образом:

<TextBox Name="FilterInputText" Visibility="{Binding VisibiltyAttr}" Width="500" Height="30" Text="{Binding InputText, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="5">
  <TextBox.InputBindings>
       <KeyBinding Command="{Binding EnterCommand}" Key="Enter" />
       <KeyBinding Command="{Binding DownSelectionCommand}" Key="Down" />
  </TextBox.InputBindings>
  <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyUp">
            <i:InvokeCommandAction  Command="{Binding CompleteCommand}" />
        </i:EventTrigger>
   </i:Interaction.Triggers>
</TextBox> 

И затем убедитесь, что метод execute вашей команды имеет правильный тип аргументов события для параметра, то при вызове CompleteCommand у вас должны быть аргументы событияв качестве параметра, и вы должны иметь возможность проверить свойство InputText в вашей модели представления для текстового значения.

Обратите внимание, что я добавил «UpdateSourceTrigger = PropertyChanged» к привязке в свойстве TextBox Text.Это приведет к тому, что свойство будет обновляться в модели представления каждый раз, когда пользователь вводит.

См. Следующую ссылку для моего источника по поведению InvokeCommandAction по умолчанию:

https://github.com/Microsoft/XamlBehaviors/issues/126

...