Я не знаю, правильный ли мой заголовок.
Что я делаю здесь, это переход к следующему элементу управления, когда пользователь нажал клавишу ВВОД.
Мои элементы управления создаются динамически.
Вот мой код:
<ItemsControl IsTabStop="False" ItemsSource="{Binding ListControls}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Grid.Column="0">
<dxmvvm:Interaction.Behaviors>
<ee:TabOnEnterBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
<TextBox Grid.Column="1">
<dxmvvm:Interaction.Behaviors>
<ee:TabOnEnterBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
<TextBox Grid.Column="2">
<dxmvvm:Interaction.Behaviors>
<ee:TabOnEnterBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
<TextBox Grid.Column="3">
<dxmvvm:Interaction.Behaviors>
<ee:TabOnEnterBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
И это мой TabOnEnterBehavior
класс, который я хочу передать ListControls, чтобы проверить, нажимает ли пользователь ENTER
на last control
public class TabOnEnterBehavior : Behavior<System.Windows.Controls.TextBox>
{
protected override void OnAttached()
{
AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;
}
private void AssociatedObject_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
var request = new TraversalRequest(FocusNavigationDirection.Down);
request.Wrapped = true;
AssociatedObject.MoveFocus(request);
}
}
protected override void OnDetaching()
{
AssociatedObject.PreviewKeyDown -= AssociatedObject_PreviewKeyDown;
}
}
Когда проект загружен, это выглядит так:
![enter image description here](https://i.stack.imgur.com/dxKit.png)
Когда пользователь нажимает клавишу ENTER
на клавиатуре, фокус переходит на текстовое поле под ним:
![enter image description here](https://i.stack.imgur.com/rdb4Q.png)
И теперь я хочу, чтобы пользователь нажимал клавишу Enter, когда фокус находится на последнем текстовом поле, например:
![enter image description here](https://i.stack.imgur.com/XdDBx.png)
Затем я хочу, чтобы фокус перешел к следующему текстовому полю, как это:
![enter image description here](https://i.stack.imgur.com/qYOa7.png)
Но я не могу заставить это работать. Как я могу это сделать?
Так что я думаю о доступе к списку, чтобы проверить, что FOCUS
уже находится в последнем элементе управления. Но как я могу передать список моему классу TabOnEnterBehavior
, не разрушая шаблон MVVM?
EDIT:
Я также попробовал KeyboardNavigation.TabIndex="3"
, но моя проблема в том, что его можно вызвать с помощью табуляции. Мое требование - ENTER
ключ. Можно ли это изменить?