繁体   English   中英

两次按Enter键时命令执行

[英]Command Executs when Enter Key is Pressed Twice

我有一个组合框。 我对它有一些输入绑定,如下所示:

<ComboBox .........>

    <ComboBox.InputBindings>
        <KeyBinding Command="{Binding DataContext.DeleteUnwantedOrderItemTransactionCommand, 
                                      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type coreUI:UserControlViewBase}}}"
                    Gesture="Return" />
        <KeyBinding Command="{Binding DataContext.DeleteUnwantedOrderItemTransactionCommand, 
                                      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type coreUI:UserControlViewBase}}}"
                    Gesture="Tab" />
    </ComboBox.InputBindings>

</ComboBox>

在ViewModel中,我具有RelayCommands,如下所示:

public RelayCommand DeleteUnwantedOrderItemTransactionCommand { get; set; }
public RelayCommand AddNewOrderItemTransactionCommand { get; set; }

public OrderViewModel(IEventAggregator _eventAggregator)
{
    eventAggregator = _eventAggregator;

    DeleteUnwantedOrderItemTransactionCommand = new RelayCommand(DeleteUnwantedOrderItemTransaction);
    AddNewOrderItemTransactionCommand = new RelayCommand(AddNewOrderItemTransaction);
}

protected void DeleteUnwantedOrderItemTransaction(object obj)
{
    if (!(SelectedOrderItemTransaction.ItemId > 0))
    {
        NewOrder.OrderItemTransactions.Remove(SelectedOrderItemTransaction);
    }

    if (NewOrder.OrderItemTransactions.Count == 0)
    {
        NewOrder.OrderItemTransactions.Add(new OrderItemTransaction());
    }

    eventAggregator.GetEvent<ChangeFocusToNextUIElementEvent>().Publish(true);
}

protected void AddNewOrderItemTransaction(object obj)
{
    if (SelectedOrderItemTransaction == NewOrder.OrderItemTransactions.Last())
        NewOrder.OrderItemTransactions.Add(new OrderItemTransaction());

    eventAggregator.GetEvent<ChangeFocusToNextUIElementEvent>().Publish(true);
}

然后在CodeBehind中:

public OrderView(OrderViewModel _viewModel, IEventAggregator _eventAggregator)
{
    InitializeComponent();
    this.DataContext = _viewModel;
    _eventAggregator.GetEvent<ChangeFocusToNextUIElementEvent>().Subscribe(MoveToNextUIElement);
}

void MoveToNextUIElement(bool obj)
{
    // Gets the element with keyboard focus.
    UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

    if (elementWithFocus != null)
    {
        elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
}

问题:

我已在InputBindings中指定,当用户按下EnterTab时 ,我想执行一个RelayCommand,并在该命令执行完成后,将焦点移到下一个元素。

在这种情况下:

当我按Tab时,一切正常。 执行该命令,并将焦点移至下一个元素。

但是当我一次按Enter键时,在组合框中选择了项目。 命令不会触发,因此,焦点不会移动到下一个元素。 当我按Enter 2nd时 ,命令将执行,焦点将按预期移至下一个控件。

但是我不想要这种行为。 我想执行命令并在一次按Enter时将焦点移到下一个元素。

只是看了看ComboBox源代码。

protected override void OnPreviewKeyDown(KeyEventArgs e)
{
    // Let ComboBox's original method handle it
    base.OnPreviewKeyDown(e);

    // Manually check if the ComboBox handled an "Enter" key
    // If yes, set e.Handled back to false so that Command binding can consume the same event
    Key key = e.Key;
    if (key == Key.Enter)
        e.Handled = false;
}

只是说-我也没有测试! 但是我认为它应该起作用。 如果没有尝试,也尝试对OnKeyDown()进行操作。 显然,ComboBox拥有这两种方法,并且都调用了私有方法KeyDownHandler(KeyEventArgs e) ,但我们无法覆盖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM