TextBox和默认Button绑定确实更新太晚了

时间:2010-04-14 14:27:19

标签: wpf mvvm binding

我有一个带有这两个控件的简单WPF对话框:

<TextBox Text="{Binding MyText}"/>
<Button Command="{Binding MyCommand}" IsDefault="True"/>

现在,当我在TextBox中输入一些文本并使用鼠标单击按钮时,一切都按预期工作:TextBox将设置MyText并调用MyCommand。

但是当我输入一些文字并按Enter键以“点击”默认按钮时,它不起作用。因为在点击进入焦点时不会离开TextBox,绑定将不会刷新MyText。因此,当调用MyCommand(其工作)时,MyText将包含旧数据。

如何在MVVM中修复此问题?在经典的代码隐藏中,我可能会在MyCommand处理程序中调用“MyButton.Focus()”,但在MVVM中,MyCommand处理程序对该按钮一无所知。

那么现在是什么??

3 个答案:

答案 0 :(得分:42)

将UpdateSourceTrigger添加到TextBox,其值为PropertyChanged。文本框的默认行为是在失去焦点时更新源。

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>

答案 1 :(得分:6)

试试这个。此代码将焦点移到单击的按钮上。因此,绑定在命令处理之前完成。

    public App()
    {
        EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(GenericButtonClickHandler));
    }

    void GenericButtonClickHandler(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        if (button == null)
            return;
        if (button.IsDefault)
            button.Focus();
    }

答案 2 :(得分:2)

One Solution ist,创建自己的类OKButton,在OnClick-Method中调用Me.Focus。这将在Click_Event之前和绑定到按钮的任何Command之前调用。您只需记住使用OKButton而不是设置IsDefault = True

Public Class OKButton
  Inherits System.Windows.Controls.Button

  Public Sub New()
  MyBase.New()
  Me.Content = "OK"
  Me.IsDefault = True
  End Sub

  Protected Overrides Sub OnClick()
  Me.Focus()
  MyBase.OnClick()
  End Sub
End Class