WPF DataGrid: LostKeyboardFocus против IsEditing и AddRows

У меня есть WPF DataGrid с одним DataGridTextColumn, Это позволяет пользователю вводить переменное число дат (сами даты заключаются в класс для целей привязки).

Но (используя UpdateSourceTrigger=Default) когда пользователь использует клавишу Tab для перехода от DataGridячейка, которую он редактировал, похоже, не выходит из режима редактирования / не проверяется. Введенное значение отображается красным цветом, а в заголовке строки отображается восклицательный знак, обрамленный пунктирной линией.

настройка UpdateSourceTrigger в LostFocus исправляет это - но когда мой код сбрасывает базовую коллекцию (для облегчения последовательного ввода данных пользователем) в коллекцию из одного элемента, DataGrid показывает только одну строку. Несмотря на CanUserAddRows="True" новая пустая строка пропадает (если мой код сбрасывает коллекцию, просто очистив ее, отображается только заголовок столбца).

Я попытался обойти это, установив Mode в OneWayToSource - но тогда DataGrid больше не показывает введенные значения.

Если я установлю UpdateSourceTrigger в PropertyChangedпроверка скоро произойдет, что приведет к плохому взаимодействию с пользователем (Даты должны быть отформатированы ДД / ММ / ГГГГ. Но, как только пользователь вводит "1/1", отображается "01.01.2016". Использование возврата редактировать год, вызывает изменение значения на "01.01.2010" и т. д.)

Кажется, есть решение ( https://social.msdn.microsoft.com/Forums/vstudio/en-US/983b3b5b-7115-4821-b621-85b43578636e/how-can-i-end-a-datagrid-cell-edit-when-focus-switches-to-a-winforms-hosted-control?forum=wpf), который требует кода, но я бы предпочел более чистое решение.

Мой код:

<DataGrid AutoGenerateColumns="False"CanUserAddRows="True" ItemsSource="{Binding CourseDatesParameterForRequest}">
<DataGrid.Columns>
    <DataGridTextColumn Header="Datum" Binding="{Binding Date, ConverterCulture=nl-BE, Mode=TwoWay, 
        StringFormat=\{0:dd/MM/yyyy\},  UpdateSourceTrigger=Default, ValidatesOnDataErrors=True}">
    </DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>

private ObservableCollection<DateWrapper> _courseDatesParameterForRequest;
public ObservableCollection<DateWrapper> CourseDatesParameterForRequest
{
    get { return _courseDatesParameterForRequest; }
    set
    {
        if (value != _courseDatesParameterForRequest)
        {
            _courseDatesParameterForRequest = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(CourseDatesParameterForRequest)));
            }
        }
    }
}

   public class DateWrapper
    {
        public int ID { get; set; }
        public DateTime Date { get; set; }
        public DateWrapper(DateTime date)
        {
            Date = date;
        }
        public DateWrapper(){}
    }

Заранее спасибо!

0 ответов

Другие вопросы по тегам