WPF DataGrid CellEditEnding - DataSet未更新Till Row丢失焦点

时间:2011-06-05 22:55:04

标签: wpf datagrid

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

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

提前致谢!

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:8)

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

经过一番搜索,我发现了一种简单的方法。 那就是添加" UpdateSourceTrigger = LostFocus"在你的数据库中的数据绑定。

例如:

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

这样就可以了,所以当每个单元格失去焦点而不是整行时,来自单元格的数据将立即更新源。

答案 2 :(得分:3)

我遇到了类似的问题,“正常”修复程序均无效...

对我有用的是按如下方式使用CommitEdit()的重载版本

DataGrid1.CommitEdit(DataGridEditingUnit.Row, true);

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以使用任何其他对象的任何PreviewMouseMove事件。 在我的情况下,我希望datagrid在向其添加新行之前失去控制。

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;
    }