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(){}
}
Заранее спасибо!