ArgumentOutOfRangeException в DataGridCellsPanel.BringIndexIntoView при нажатии клавиши ввода для сетки данных WPF? - PullRequest
5 голосов
/ 08 марта 2011

У меня есть этот 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.EditCell вызывает событие PropertyChanged для свойства 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 ]

5 голосов
/ 08 марта 2011

У меня была похожая проблема при вызове myDataGrid.ScrollIntoView(object item) прямо из моего кода. Я исправил это, позвонив myDataGrid.UpdateLayout() прямо перед этим. Вы можете попробовать, если применимо.

1 голос
/ 25 января 2013

У меня есть именно эта проблема, и я до сих пор не знаю, почему это происходит. Скорее неудовлетворительно, в итоге я обошел его, поймав клавишу ввода и зафиксировав изменения вручную.

    private void MyDataGrid_OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Return)
        {
            e.Handled = true;
            MyDataGrid.CommitEdit();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...