我有一个带有这两个控件的简单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)
小智 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)