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

Sam*_*Sam 34 wpf binding mvvm

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

<TextBox Text="{Binding MyText}"/>
<Button Command="{Binding MyCommand}" IsDefault="True"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么现在呢?

Jeh*_*hof 44

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

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)

  • 所以我需要将它添加到每个绑定中(因为键盘快捷键总是可以访问按钮)? (3认同)

小智 8

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

    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();
    }
Run Code Online (Sandbox Code Playgroud)

  • +1在我的情况下,这是最好的解决方案.将UpdateSourceTrigger更改为PropertyChanged将导致验证和脏检查问题.这为一个非常恼人的问题提供了全局解决方案. (3认同)