3

我的 MVVM 应用程序中有一个数据网格,由于客户端希望显示数据的方式,需要使用模板列。他们需要一些典型的数据输入功能(按 Enter 执行数据检查,如果有效则提交该行,关注下一行的第一个文本框;按 Tab 关注下一个文本框......)。此外,数据通常从外部源导入到网格中,通常一次导入数千条记录。

现在,我有一个 Loaded 事件连接到每个文本框,我在添加新行后使用它来设置焦点。我的问题是当我导入很多行时网格会变得混乱。当用户滚动时,Loaded 事件被触发,并且网格变得基本不可用。我禁用了虚拟化以防止这种情况发生,并且发现我的网格在某些配置中占用了大量 RAM,这是不可接受的。在不使用大量内存的情况下,我想不出一种方法让这个网格按照他们需要的方式工作。似乎我只需要能够将文本框集中在新添加的行中,但由于数据验证是在视图模型中执行的,我无法访问代码隐藏中的新行,所以我不能只是调用“newtextbox.focus()”或其他什么。我在这里变得非常绝望,

4

1 回答 1

2

在后面的代码中放置一个事件监听器,它可以调用你的 newtextbox.focus() (以及你想做的任何其他事情)。在视图模型的验证中,使用 args 触发事件,该参数指示您希望网格执行的操作。

编辑:好的,新方法。尝试捕获击键,然后在 enter 或 tab 上做你想做的事情。

这将在您的 xaml 中

<Grid  KeyUp="myDataGrid_KeyUp" >

这将进入您的代码隐藏

    private void myDataGrid_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // do your enter stuff here, manipulate the view model for validation, etc.
        }
        else if (e.Key == Key.Tab)
        {
            // do your tab stuff here (get selected row, determine cell focus, focus on next cell)
        }
    }
于 2011-08-02T17:02:31.943 回答