在我看来,有一个TextBox和一个Button,TextBox的Text属性绑定到ViewModel中的公共属性,当用户单击该按钮时,获取TextBox中的文本。我还将Button的IsDefault属性设置为true,这样我就可以按Enter来触发click事件。我的项目使用MVVM,因此按钮的命令也在ViewModel中。现在,问题是,我点击按钮,我可以在TextBox中获取文本,但如果我按下回车键,我无法获取文本,它总是为空。我设置断点并发现,如果我在文本框中输入一些文本并单击按钮,则会触发RaisePropertyChanged事件,但如果我按下按钮,则不会。 任何人都可以帮忙吗?
谢谢!
答案 0 :(得分:5)
默认情况下,TextBox
仅在焦点丢失时更新绑定到Text
的属性。您有两种选择,可以引起焦点更改(这可能会让用户烦恼)或更改此行为。
要更改行为,请将TextBox绑定的UpdateSourceTrigger
属性修改为PropertyChanged
:
<TextBox Text={Binding Path=MyTextProperty, UpdateSourceTrigger=PropertyChanged}/>
根据您对每项房产变更的工作量,这可能适用于您,也可能不适用。在某些情况下,它可能会显着降低性能。如果是这种情况,我建议重新处理您的视图模型代码,以便在属性更改时执行更少的工作。
答案 1 :(得分:3)
我使用这种方法来完成这项工作。只需将eventhandler添加到app.xaml.cs OnStartUp()
即可 EventManager.RegisterClassHandler(typeof (Button), ButtonBase.ClickEvent, new RoutedEventHandler(ButtonClick));
private void ButtonClick(object sender, RoutedEventArgs e)
{
if (sender != null && sender is Button)
{
(sender as Button).Focus();
}
}
答案 2 :(得分:0)
我已经修改了blindmeis&#39;回答将焦点设置回最初具有焦点的控件。
EventManager.RegisterClassHandler(typeof(Button), ButtonBase.ClickEvent, new RoutedEventHandler((sender, args) =>
{
var btn = sender as Button;
if (btn == null || ReferenceEquals(btn, Keyboard.FocusedElement))
return;
var originalFocus = Keyboard.FocusedElement;
btn.Focus();
if (originalFocus != null && originalFocus.Focusable)
originalFocus.Focus();
}));