我正在使用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
:
sender
是TimePicker
控件
好的,所以您将焦点设置为错误的控件。或者,实际上,它适用于其他人,因为它会导致TextBox
LostFocus
事件(将焦点设置为其他任何事情也可以),但当您想继续使用键盘键入值时则不然。
在 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
。如果可以更改控件模板,这是可取的方法。