使用MVVM Pattern将List传递给类

时间:2018-05-02 08:11:14

标签: c# wpf mvvm textbox

我不知道我的头衔是否正确。

我在这里做的是当用户按下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 image description here

当用户按下键盘上的ENTER键时,焦点将转到其下方的文本框中:

enter image description here

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

enter image description here

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

enter image description here

但我无法使其发挥作用。我该怎么办?

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

编辑:

我也试过了KeyboardNavigation.TabIndex="3",但我的问题是它可以使用标签触发。我的要求是ENTER密钥。是否有可能改变它?

1 个答案:

答案 0 :(得分:1)

我强烈反对你不这样做,因为普通用户习惯使用tab shift + tab navigation并输入key作为accept - button的等价物。

但是如果你真的需要使用回车键,你仍然可以使用Tabbing机制并使用InputManager在AssociatedObject_PreviewKeyDown上发送标签。

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