在WPF Datagrid上按Enter键时,DataGridCellsPanel.BringIndexIntoView中的ArgumentOutOfRangeException?

时间:2011-03-08 19:18:20

标签: c# wpf mvvm datagrid

我在数据模板中有这个WPF DataGrid

<DataGrid
    CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False"
    CanUserSortColumns="False"
    SelectionMode="Single" SelectionUnit="FullRow" GridLinesVisibility="Horizontal"
    IsEnabled="{Binding Enabled}"
    ItemsSource="{Binding ValuesDataTable}"
    CellEditEnding="DataGrid_CellEditEnding"/>

这是事件处理程序:

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
        var textBox = e.EditingElement as TextBox;
        var dataGrid = (DataGrid)sender;
        var viewModel = dataGrid.DataContext as IHasEditableCell;
        viewModel.EditCell(e.Row.GetIndex(), e.Column.DisplayIndex, textBox.Text);
        dataGrid.CancelEdit();
    }
}

关键是viewModel.EditCellPropertyChanged绑定的视图模型的ValuesDataTable属性上引发DataGrid事件。

当我编辑单元格并单击它时,它工作正常。但是,当我编辑一个单元格并在编辑结束时按Enter键时,我得到了这个运行时异常:

System.ArgumentOutOfRangeException was unhandled
  Message=Specified argument was out of the range of valid values.
Parameter name: index
  Source=PresentationFramework
  ParamName=index
  StackTrace:
       at System.Windows.Controls.DataGridCellsPanel.BringIndexIntoView(Int32 index)
       at System.Windows.Controls.Primitives.DataGridCellsPresenter.ScrollCellIntoView(Int32 index)
       at System.Windows.Controls.DataGrid.ScrollCellIntoView(Object item, DataGridColumn column)...

......这很奇怪。我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

直接从我的代码调用myDataGrid.ScrollIntoView(object item)时遇到了类似的问题。我刚才通过调用myDataGrid.UpdateLayout()修复了它。 如果适用,您可能想尝试一下。

答案 1 :(得分:1)

我确实存在这个问题,但仍然不知道为什么会这样。相当令人不满意的是,我最终通过捕获回车键并手动提交编辑来解决它。

    private void MyDataGrid_OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Return)
        {
            e.Handled = true;
            MyDataGrid.CommitEdit();
        }
    }