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();
}

该值似乎发生了变化,但现在我无法在时间选择器中键入任何内容,因为每当文本更改时,焦点都会丢失。有什么办法可以解决这个问题吗?

仅供参考,看起来您正在使用此问题的解决方法。

你在说什么里面TimePicker_TextChanged

senderTimePicker控件

好的,所以您将焦点设置为错误的控件。或者,实际上,它适用于其他人,因为它会导致TextBoxLostFocus事件(将焦点设置为其他任何事情也可以),但当您想继续使用键盘键入值时则不然。

在 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,将焦点传递到其他地方,然后将其放回原处。这应该触发LostFocusTextBox事件,如果TimePicker使用与UpdateSourceTrigger=LostFocus绑定或处理LostFocus,这将起作用(我不知道xctk:TimePicker究竟是如何工作的)。


另一种方法是更改该TextBox.Text的绑定以具有UpdateSourceTrigger=PropertyChanged。如果可以更改控件模板,这是可取的方法。

最新更新