我想添加一个键绑定到TextBox
,这样当我按 ENTER 键时,相应的命令将会触发,但我只希望在{{{{{{ 1}}专注于它。
以下代码添加了绑定,但只要按下 Return 键,无论焦点位于窗口的哪个位置,它都会触发。是否可以仅在TextBox
具有焦点时限制键绑定?
TextBox
答案 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
。遗憾的是,IsFocused
,IsKeyboardFocused
和IsKeyboardFocusWithin
都是只读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模式。