首页 > 解决方案 > 使用 MVVM 模式将列表传递给类

问题描述

我不知道我的标题是否正确。

我在这里做的是当用户按下 ENTER 键时导航到下一个控件。

我的控件是动态创建的。

这是我的代码:

<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键盘上的键时,焦点转到它下面的文本框:

在此处输入图像描述

现在,我想要的是当焦点位于最后一个文本框时用户按下 Enter 键,如下所示:

在此处输入图像描述

然后我希望焦点转到下一个文本框,如下所示:

在此处输入图像描述

但我不能让它工作。我该怎么做?

所以我正在考虑访问列表以检查是否FOCUS已经在最后一个控件中。TabOnEnterBehavior但是如何在不破坏 MVVM 模式的情况下将列表传递给我的班级?

编辑:

我也尝试过,KeyboardNavigation.TabIndex="3"但我的问题是它可以使用选项卡触发。我的要求是ENTER关键。有可能改变它吗?

标签: c#wpfmvvmtextbox

解决方案


我强烈建议您不要这样做,因为普通用户习惯于制表符 | shift+tab 导航和 enter 键相当于接受 - 按钮。

但是,如果您确实需要使用回车键,您仍然可以使用选项卡机制并使用InputManager在 AssociatedObject_PreviewKeyDown 上发送选项卡。

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


推荐阅读