在我看来,我有一个Textbox
和一个Button
旁边的<{strong> 附加到Command
,可以执行或不执行(生成按钮)启用或禁用)基于在文本框中输入的正确值。
一切正常,除非用户输入正确的值并按下TAB后,焦点不会移动到指定的按钮,而是移动到后面的控件,尽管该按钮已正确启用。
换句话说,在按下TAB以启用按钮并获得焦点后,UI的速度不够快。相反,该按钮已启用,但在焦点已移至另一个控件后。
UpdateSourceTrigger
绑定的TextBox
是LostFocus
,我希望这样,因为很多事情恰好让每个字符PropertyChanged
用户输入。
有什么建议吗?提前谢谢。
答案 0 :(得分:0)
在我看来,您有几个选择:
UpdateSourceTrigger=Explicit
代替LostFocus
并附加您自己的LostFocus
处理程序,它们都会更新绑定,并且如果相关,还会将焦点设置在您的按钮上。LostFocus
处理程序,检查文本是否有效,如果是,则将焦点设置回按钮。在这两种情况下,您可能需要在单独的调度程序消息中执行设置焦点:
private void OnLostFocus(...)
{
if (textIsValid)
{
this.Dispatcher.BeginInvoke((Action)() => button.Focus());
}
}
答案 1 :(得分:0)
最后,我找到了一个解决方案而没有破坏我使用的MVVM模式(指具有特定名称的特定控件)。
我所做的是将UpdateSourceTrigger
设置为PropertyChanged
而不是LostFocus
。 PropertyChanged
的问题是我的ValueConverter
不再运行了。因此,虽然按钮现在可以正确启用或禁用,并且准时接收焦点,但我的文本框中显示的值不正常。
我通过收听文本框的LostFocus
事件解决了这个问题,现在使用BindingExpression.UpdateTarget()
我的TextBox.Text
正确显示。
这是:
<TextBox
Text="{Binding Path=SpecialText, Converter={StaticResource myConverter}, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
LostFocus="TextBox_LostFocus">
</TextBox>
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
(sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}