Передача списка в класс с использованием шаблона MVVM - PullRequest
0 голосов
/ 02 мая 2018

Я не знаю, правильный ли мой заголовок.

Что я делаю здесь, это переход к следующему элементу управления, когда пользователь нажал клавишу ВВОД.

Мои элементы управления создаются динамически.

Вот мой код:

<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

Когда пользователь нажимает клавишу ENTER на клавиатуре, фокус переходит на текстовое поле под ним:

enter image description here

И теперь я хочу, чтобы пользователь нажимал клавишу Enter, когда фокус находится на последнем текстовом поле, например:

enter image description here

Затем я хочу, чтобы фокус перешел к следующему текстовому полю, как это:

enter image description here

Но я не могу заставить это работать. Как я могу это сделать?

Так что я думаю о доступе к списку, чтобы проверить, что FOCUS уже находится в последнем элементе управления. Но как я могу передать список моему классу TabOnEnterBehavior, не разрушая шаблон MVVM?

EDIT:

Я также попробовал KeyboardNavigation.TabIndex="3", но моя проблема в том, что его можно вызвать с помощью табуляции. Мое требование - ENTER ключ. Можно ли это изменить?

1 Ответ

0 голосов
/ 03 мая 2018

Я бы настоятельно не рекомендовал вам этого делать, потому что обычные пользователи привыкли к табу | Shift + вкладка навигации и введите ключ как эквивалент кнопки подтверждения -

Но если вам действительно нужно использовать клавишу ввода, вы все равно можете использовать механизм вкладок и отправить вкладку на AssociatedObject_PreviewKeyDown, используя InputManager .

https://michlg.wordpress.com/2013/02/05/wpf-send-keys/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...