ReactiveUI с WPF DatePicker - PullRequest
       20

ReactiveUI с WPF DatePicker

0 голосов
/ 30 октября 2019

Не удается получить привязку к работе WPF DatePicker, как ожидалось с ReactiveUI. Привязка устанавливается в коде, подобном следующему:

this.Bind(this.ViewModel, x => x.MyDate, x => x.DPMyDate.SelectedDate, DPMyDate.Events().LostKeyboardFocus).DisposeWith(disposables);

В файле XAML это выглядит так:

<DatePicker Name="DPMyDate"></DatePicker>

, а свойство привязки выглядит так:

private DateTime myDate;
public DateTime MyDate
{
    get { return myDate; }
    set
    {
        this.RaiseAndSetIfChanged(ref myDate, value);
    }
}

Изменение даты с помощью календаря работает, как и ожидалось. Однако когда я изменяю дату с помощью клавиатуры, свойство привязки не изменяется! Интересно, что когда я перемещаю фокус из DatePicker после того, как я изменил дату, затем возвращаюсь и возвращаюсь снова (ничего не меняя), исходное изменение устанавливается. Я предполагаю, что это как-то связано с обработкой внутреннего фокуса DatePicker с его TextBox, но я не понимаю, есть ли это и проблема с WPF или ReactivUI.

Любая идея?

Обновление 1

В качестве теста я напрямую назначил обработчик события DatePickers LostKeyboardFocus. Это событие срабатывает каждый раз, когда элемент управления теряет фокус. Однако ReactiveUI не улавливает первую потерю фокуса!

1 Ответ

0 голосов
/ 30 октября 2019

Извините, что ответил на мой вопрос через 40 минут после того, как я его опубликовал. Но минуту назад я обнаружил, что привязка к LostKeyboardFocus является неправильным способом для DatePickers. Надо привязать к SelectedDateChanged!

В LostKeyboardFocus SelectedDate все еще имеет свое первоначальное значение, и поэтому ReactiveUI правильно не изменяет свойство при первой потере фокуса. Что касается дальнейших потерь фокуса, то это всегда на одно изменение позади.

У меня было какое-то впечатление, что это должно работать как с TextBox, где вы часто хотите инициировать изменение, только когда блок теряет фокус, но DatePicker здесь особенный.

...