仅在聚焦时将“返回”键绑定到文本框

时间:2018-02-09 15:54:30

标签: wpf xaml key-bindings

我想添加一个键绑定到TextBox,这样当我按 ENTER 键时,相应的命令将会触发,但我只希望在{{{{{{ 1}}专注于它。

以下代码添加了绑定,但只要按下 Return 键,无论焦点位于窗口的哪个位置,它都会触发。是否可以仅在TextBox具有焦点时限制键绑定?

TextBox

2 个答案:

答案 0 :(得分:1)

这是默认行为。如果我将以下两个TextBoxes放在StackPanel中,将键盘焦点放到第二个并按 ENTER ,则命令被触发

<StackPanel>
    <TextBox Text="{Binding SearchBoxNumber, UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Key="Return" Command="{Binding SearchCommand}" />
        </TextBox.InputBindings>
    </TextBox>

    <TextBox />
</StackPanel>

答案 1 :(得分:0)

您可以向SearchCommand.CanExecute添加条件,以便在焦点不在false时返回TextBox。遗憾的是,IsFocusedIsKeyboardFocusedIsKeyboardFocusWithin都是只读DP,即使您设置了{{1,也无法通过标记(XAML)绑定它们到Mode。您可以为此创建自己的控件,该控件派生自OneWayToSource

TextBox

然后将public class FocusAwareTextBox : TextBox { protected override void OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e) { if (e.OldValue != e.NewValue && e.NewValue != null) { HasFocus = (bool)e.NewValue; } base.OnIsKeyboardFocusWithinChanged(e); } public bool HasFocus { get { return (bool)GetValue(HasFocusProperty); } set { SetValue(HasFocusProperty, value); } } public static readonly DependencyProperty HasFocusProperty = DependencyProperty.Register( nameof(HasFocus), typeof(bool), typeof(FocusAwareTextBox), new PropertyMetadata(false)); } DP绑定到ViewModel中的新bool属性,并在HasFocus中添加对此bool属性的检查。

另一个解决方案是处理SearchCommand.CanExecute事件,然后从那里调用命令。请注意,您必须使用Behavior来保留MVVM模式。