【问题标题】:WPF DataGrid CellEditEnding - DataSet Not Updating Till Row Lost FocusWPF DataGrid CellEditEnding - 数据集不更新直到行失去焦点
【发布时间】:2011-09-08 22:35:13
【问题描述】:

一旦单元格因编辑而失去焦点,我需要能够更新数据集的值。我知道单元格何时失去焦点(CellEditEnding),但问题是,它的上下文项的实际更新不会发生,直到焦点实际发生在该行上。当只剩下一个项目时,这将成为一个大问题,因为它可能永远不会失去焦点。

如何确保每次完成列编辑 (CellEditEnding) 时,该行的实际上下文都会在该点更新(而不仅仅是在该行失去焦点时)

提前致谢!

【问题讨论】:

  • 因为这是一个触摸屏应用程序,我可以通过在鼠标悬停在任何其他项目上(触摸开始)时将焦点设置到隐藏项目来应用它......但是一种不那么骇人听闻的方法不胜感激!

标签: wpf datagrid


【解决方案1】:

您可以使用DataGrid.CellEditEnding 处理程序中的DataGrid.CommitEdit,确保处理重入。

这是描述该技术的博客文章:

【讨论】:

  • 即使使用你提到的代码,我开始编辑的第一行仍然在 EditMode 下,我无法编辑其他行进行编辑。
【解决方案2】:

我遇到了类似的问题,我有一个包含 5 列的 DataGrid 行。 只有在整个数据网格行失去焦点后,才会在源中更新 5 列中的数据。

经过一番搜索,我找到了一种简单的方法。 即在单元格的数据绑定中添加“UpdateSourceTrigger=LostFocus”。

例如:

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <ComboBox DisplayMemberPath="Name"
                  ItemsSource="{Binding Path=MyDataSets}"
                  SelectedValue="{Binding Path=DataSelected, UpdateSourceTrigger=LostFocus}"/>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

这样可以解决问题,因此当每个单元格失去焦点时,而不是整行,来自单元格的数据将立即更新源。

【讨论】:

  • 您也可以将其更改为:SelectedValue="{Binding Path=DataSelected, UpdateSourceTrigger=PropertyChanged}" 它对我有用..thanx :)
【解决方案3】:

只需调用 [control].Focus() 即可跳转到对话框的任何其他控件。在 OnClosing() 事件中执行此操作。

LostFocus 是数据单元格的默认更新触发器。但是窗口本身以及窗口的边框或标题(以及系统按钮“X”)无法获得焦点。这就是编辑没有结束的原因。

【讨论】:

    【解决方案4】:

    您可以使用来自任何其他对象的任何 PreviewMouseMove 事件。 就我而言,我希望数据网格在添加新行之前放松控制。

    MainWindow.xaml.cs

    private void MenuItem_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            Grid.CommitEdit();
        }
    

    MainWindow.xaml

     <MenuItem Header="New Line" Command="{Binding CommandNewRow}" PreviewMouseMove="MenuItem_PreviewMouseMove"/>
    

    MainWindowViewModel.cs

        public ICommand CommandNewRow
        {
            get
            {
                if (_commandNewRow == null)
                {
                    _commandNewRow = new RelayCommand(p => CommandNewRowExecute(), p => CommandNewRowCanExecute());
                }
                return _commandNewRow;
            }
        }
    
        private void CommandNewRowExecute()
        {
           FileList.Add(new File("", ""));
        }
    
        private bool CommandNewRowCanExecute()
        {
            if (FileList.Count > 0)
                return true;
            return false;
        }
    

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题,但“通常”的修复都没有奏效...

      对我有用的是使用CommitEdit() 的重载版本,如下所示

      DataGrid1.CommitEdit(DataGridEditingUnit.Row, true);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2017-04-04
        相关资源
        最近更新 更多