Удерживать курсор в ячейке после отмены в событии WPF DataGrid CellEditEnding с MVVM - PullRequest
0 голосов
/ 25 октября 2018

У меня есть ячейка в сетке данных, которую я редактирую.Когда редактирование ячейки закончено, я использую событие CellEditEnding в сетке, чтобы зафиксировать это и выполнить некоторую проверку.Если проверка не удалась, мне нужно оставить курсор в этой ячейке и не переходить к следующей.Как вы можете видеть, я устанавливаю для параметра Cancel значение true, но все, что нужно сделать, это сохранить ячейку в режиме редактирования и, тем не менее, позволить курсору перейти к следующей ячейке.Мне нужен способ держать курсор в ячейке, пока все не будет в порядке.

xaml:

<DataGrid Style="{StaticResource ApplicationTabDataGridStyle}"
          ItemsSource="{Binding CurrentContacts, Mode=TwoWay}"
          SelectedValue="{Binding AddressGridItemSelected}"
          x:Name="ChangeInfoAddressGrid">

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="CellEditEnding">
            <command:EventToCommand PassEventArgsToCommand="True"
                                    Command="{Binding ValidateAddressRowCommand}"/>
    </i:EventTrigger>
    </i:Interaction.Triggers>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Address 1" MinWidth="60"
                            Binding="{Binding Addr1, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                            IsReadOnly="{Binding Data.AddressGridItemSelected.CanEdit, 
                                                 Converter={StaticResource boolToOppositeBoolConverter}, 
                                                 Source={StaticResource IsReadyOnlyProxy}}">
            <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="TextBox">
                    <Setter Property="MaxLength" Value="26" />
                </Style>
            </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>

    ...

    </DataGrid.Columns>
</DataGrid>

c #

public RelayCommand<object> ValidateAddressRowCommand => new RelayCommand<object>(ValidateAddressRow);
private void ValidateAddressRow(object eventArgs)
{
    var cellEventArgs = eventArgs as DataGridCellEditEndingEventArgs;
    // DO SOME VALIDATION

    ...

    cellEventArgs.Cancel = true;     
    cellEventArgs.EditingElement.Focus();
}

1 Ответ

0 голосов
/ 25 октября 2018

Я сделал это с помощью DataGrid_CellEditEnding обработчика событий и использовал диспетчер для достижения цели (у меня была таблица данных):

private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    e.Cancel = true;
    (sender as DataGrid).Dispatcher.BeginInvoke((Action)(()=>
        {
            (sender as DataGrid).SelectedIndex = e.Row.GetIndex();
            e.EditingElement.Focus();
        }
    ));
}

Вы можете настроить его для своих нужд.Я запутался, что вы используете классы View (DataGridCellEditEndingEventArgs) во ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...