MVVM WPF 数据表格数据输入问题

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

现在,我为每个文本框连接了一个Loaded事件,我正在使用它来设置新行添加后的焦点。我的问题是,当我导入大量行时,网格变得非常混乱。随着用户滚动,Loaded事件被触发,网格基本上无法使用。我禁用了虚拟化以防止这种情况,并发现我的网格在某些配置中占用了1GB的RAM,这是不可接受的。我找不到一种方法使这个网格按照他们的要求工作而不使用大量内存。似乎我只需要能够在新添加的行中聚焦文本框,但由于数据验证是在视图模型中执行的,我无法在代码中访问新行,因此不能调用“newtextbox.focus()”或其他操作。我现在非常绝望,任何建议都将不胜感激。


1
WPF中的焦点有点让人头疼。查看Josh Smith的这篇文章http://joshsmithonwpf.wordpress.com/2010/03/16/control-input-focus-from-viewmodel-objects/,也许会有解决方案的提示。 - Matthieu
那么,您可以使用网格仅用于显示,并跳过网格中的编辑/验证。然后,当某个网格行被双击时,会弹出一个网格行编辑器,该编辑器可用于对网格行进行编辑。 - hkon
那肯定行不通...客户要求在表格内直接进行数据输入。我试过了。 - drowned
@drowned,你是否在使用批量插入到绑定到数据网格的ObservableCollection中? - WPF-it
不,我不是。在数据输入时,我一次插入一行……在导入期间,我只是将一个新集合分配给绑定到网格的对象。 - drowned
1个回答

2
在代码后面放置一个事件监听器,可以调用newtextbox.focus()(以及其他您想要执行的操作)。在视图模型的验证中,使用参数触发事件,指示您希望网格执行的操作。
编辑:好的,新的方法。尝试捕获按键,然后在按下回车或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)
        }
    }

这听起来很有趣,但是如果不使用静态事件,我怎么能在视图模型中触发一个可以在代码后台处理的事件呢? - drowned
我最终放弃了MVVM方法,只是在代码后端纯粹地采用了这个答案。我没有更多的时间去与这个荒谬的架构斗争,只是为了说它是“MVVM”。捕获键事件完美地解决了问题,谢谢。 - drowned
太好了!很高兴它对你有用。我也大多使用MVVM,但有时你只需要做有效的事情,这样你就可以继续解决下一个问题。 - Brad Boyce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接