【问题标题】:MVVM WPF datagrid data entry problemMVVM WPF datagrid 数据录入问题
【发布时间】:2011-08-01 20:28:08
【问题描述】:

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

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

【问题讨论】:

  • Focus 在 WPF 中有点像派对垃圾。查看 Josh Smith joshsmithonwpf.wordpress.com/2010/03/16/… 的这篇文章,也许有解决方案的提示。
  • 如果您跳过网格中的编辑/验证并仅使用网格进行显示的解决方案怎么样。然后当说一个网格行时,双击你会弹出一个网格行编辑器,它可以编辑网格中的行。
  • 那绝对不会飞...客户希望直接在网格中输入数据。我试过了。
  • @drowned,您是否在绑定到您的数据网格的 ObservableCollection 中使用批量插入?
  • 不,我不是。在数据输入期间,我一次插入一行......在导入期间,我只是将一个新集合分配给绑定到网格的对象。

标签: wpf mvvm datagrid data-entry


【解决方案1】:

在后面的代码中放置一个事件监听器,它可以调用你的 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)
        }
    }

【讨论】:

  • 这听起来很有趣,但是,如果不使用静态事件,如何在视图模型中触发可以在代码隐藏中处理的事件?
  • 我最终放弃了这个屏幕的 MVVM 方法,只是在代码隐藏中使用这个答案。我根本没有更多时间与这种荒谬的架构作斗争,只是说它是“MVVM”。捕获关键事件非常有效,谢谢。
  • 太棒了!很高兴它对你有效。我也主要有 MVVM,但有时你只需要做一些有效的事情就可以解决下一个问题。
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
相关资源
最近更新 更多