Значение timepicker инструментария wpf не меняется при ручном вводе времени, но срабатывает при изменении фокуса

Я использую WPF toolkit TimePicker

<xctk:TimePicker Name="timePicker" 
                 StartTime="{Binding MpStartTime,UpdateSourceTrigger=PropertyChanged}"  
                 EndTime="{Binding MpEndTime,UpdateSourceTrigger=PropertyChanged}"    
                 TextBoxBase.TextChanged="TimePicker_TextChanged"
                 Value="{Binding ResTime,UpdateSourceTrigger=PropertyChanged,Mode="TwoWay"}"
                 Format="Custom" 
                 FormatString="hh:mm tt"/>

Проблема в том, что когда я ввожу время вручную с цифровой клавиатуры, PropertyChanged не запускается, и время не обновляется в модели просмотра.

Фактическая проблема заключается в том, что значение не обновляется до тех пор, пока фокус не будет потерян, поэтому, когда я добавляю следующую строку:

private void TimePicker_TextChanged(object sender, TextChangedEventArgs e)
{
        timePicker.Focus();
}

Кажется, что значение меняется, но теперь я не могу ничего вводить в средстве выбора времени, поскольку фокус теряется при изменении текста. Есть ли способ решить эту проблему?

Измените UpdateSourceTrigger на LostFocus, чтобы при перемещении фокуса из TimePicker запускался триггер.

user1672994 11.04.2018 13:01

sender и timePicker - это один и тот же TextBox?

Sinatr 11.04.2018 13:41

@ user1672994 no Что я пробовал, не работает.

Vishnu Babu 11.04.2018 14:29

@Sinatr sender - это элемент управления TimePicker

Vishnu Babu 11.04.2018 14:30
1
4
601
1

Ответы 1

Для справки, похоже, вы использовали обходной путь от этот вопрос.

Вы говорите, что внутри TimePicker_TextChanged:

sender is the TimePicker control

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

В WPF пользовательские элементы управления часто являются составными, поэтому я считаю, что где-то есть дочерний элемент TextBox.

Вы можете попробовать следующий код:

void TimePicker_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = FocusManager.GetFocusedElement(this) as TextBox;
    if (textBox != null)
    {
        textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        textBox.Focus();
    }
}

Идея состоит в том, чтобы найти дочерний TextBox, передать фокус в другое место и затем вернуть его обратно. Это должно вызвать событие LostFocus для TextBox и сработает, если TimePicker использует связывание с UpdateSourceTrigger=LostFocus или обрабатывает LostFocus (я не знаю, как именно работает xctk:TimePicker).


Другой подход состоял бы в изменении связывания этого TextBox.Text с UpdateSourceTrigger=PropertyChanged. Это предпочтительный способ, если вы можете изменить шаблон управления.

Спасибо за ваши усилия. Теперь TextBox внутри средства выбора времени, кажется, сфокусирован, но почему-то я все еще не могу печатать.

Vishnu Babu 12.04.2018 07:01

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