我有一个带有这两个控件的简单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处理程序对该按钮一无所知。
那么现在是什么??
答案 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