我的MVVM应用程序中有一个datagrid,由于客户端想要显示数据的方式,需要使用模板列。他们想要一些典型的数据输入功能(按Enter键执行数据检查,如果有效则提交行,重点关注下一行的第一个文本框;按Tab键聚焦下一个文本框...)。此外,数据通常从外部源导入到网格中,通常一次导入数千条记录。
现在,我有一个Loaded事件连接到每个文本框,我用它来添加新行后设置焦点。我的问题是,当我导入很多行时,网格变得混乱。当用户滚动时,Loaded事件被触发,并且网格基本上变得不可用。我禁用了虚拟化以防止这种情况,并且发现我的网格在某些配置中占用了一大笔RAM,这是不可接受的。我不知道如何在不使用大量内存的情况下让这个网格以他们需要的方式工作。似乎我只需要能够将文本框集中在新添加的行中,但由于数据验证是在viewmodel中执行的,因此我无法访问代码隐藏中的新行,所以我不能只是调用“newtextbox.focus()”或其他什么。我在这里非常绝望,任何建议都会受到大力赞赏。
答案 0 :(得分:2)
在后面的代码中放置一个事件监听器,可以调用newtextbox.focus()(以及您想要做的任何其他事情)。在视图模型的验证中,使用args触发事件,指示您希望网格执行的操作。
编辑:好的,新方法。尝试捕获击键,然后在输入或选项卡上执行您希望它执行的操作。
这将在你的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)
}
}