在TextBox中正确输入后按钮启用

时间:2012-05-24 06:51:29

标签: c# wpf mvvm

在我看来,我有一个Textbox和一个Button 旁边的<{strong> 附加到Command,可以执行或不执行(生成按钮)启用或禁用)基于在文本框中输入的正确值。

一切正常,除非用户输入正确的值并按下TAB后,焦点不会移动到指定的按钮,而是移动到后面的控件,尽管该按钮已正确启用。

换句话说,在按下TAB以启用按钮并获得焦点后,UI的速度不够快。相反,该按钮已启用,但在焦点已移至另一个控件后。

UpdateSourceTrigger绑定的TextBoxLostFocus,我希望这样,因为很多事情恰好让每个字符PropertyChanged用户输入。

有什么建议吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

在我看来,您有几个选择:

  1. 使用UpdateSourceTrigger=Explicit代替LostFocus并附加您自己的LostFocus处理程序,它们都会更新绑定,并且如果相关,还会将焦点设置在您的按钮上。
  2. 附加您自己的LostFocus处理程序,检查文本是否有效,如果是,则将焦点设置回按钮。
  3. 在这两种情况下,您可能需要在单独的调度程序消息中执行设置焦点:

    private void OnLostFocus(...)
    {
        if (textIsValid)
        {
            this.Dispatcher.BeginInvoke((Action)() => button.Focus());
        }
    }
    

答案 1 :(得分:0)

最后,我找到了一个解决方案而没有破坏我使用的MVVM模式(指具有特定名称的特定控件)。

我所做的是将UpdateSourceTrigger设置为PropertyChanged而不是LostFocusPropertyChanged的问题是我的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();
}