C# WPF toolkit TimePicker值在时间手动输入时未更改,但在焦点更改时激发

C# WPF toolkit TimePicker值在时间手动输入时未更改,但在焦点更改时激发,c#,wpf,xaml,mvvm,wpftoolkit,C#,Wpf,Xaml,Mvvm,Wpftoolkit,我正在使用wpftoolkit时间选择器 <xctk:TimePicker Name="timePicker" StartTime="{Binding MpStartTime,UpdateSourceTrigger=PropertyChanged}" EndTime="{Binding MpEndTime,UpdateSourceTrigger=PropertyChanged}"

我正在使用
wpftoolkit时间选择器

<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"/>

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

仅供参考,看起来您使用的是来自的变通方法

您所说的是时间选择器中更改的内容:

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();
    }
}
我们的想法是找到child
TextBox
,将焦点传递到其他地方,然后将其设置回原来的位置。这应该会触发
TextBox
LostFocus
事件,如果
TimePicker
使用与
UpdateSourceTrigger=LostFocus
的绑定,或者如果它处理
LostFocus
(我不知道
xctk:TimePicker
的具体工作原理)



另一种方法是改变
TextBox.Text的绑定,使
UpdateSourceTrigger=PropertyChanged
。如果您可以更改控件模板,这是一种更好的方法。

将UpdateRucketRegiger更改为
LostFocus
,这样一旦您将焦点移出时间选择器,触发器就会触发。
sender
TimePicker
是相同的
文本框吗?@user1672994不,我试过它不起作用。@Sinatr
sender
TimePicker
control感谢您的努力,现在时间选择器内的
文本框似乎变得专注了,但不知何故我仍然无法输入。
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();
    }
}