按下“Enter”键不会引发WPF属性更改事件

3
在我的项目中,有一个文本框和一个按钮。文本框的Text属性绑定到ViewModel中的一个公共属性上。当用户单击按钮时,获取文本框中的文本。我还将按钮的IsDefault属性设置为true,以便按Enter键触发单击事件。由于我的项目使用了MVVM模式,所以按钮的命令也在ViewModel中。现在的问题是,当我单击按钮时,我可以获取文本框中的文本,但如果我按下Enter键,就无法获取文本,它总是null。我设置了断点并发现,如果我在文本框中输入文本并单击按钮,RaisePropertyChanged事件将被触发,但如果我按按钮,则不会触发该事件。 有人可以帮忙解决吗?
谢谢!

我不相信按钮点击会引起 RaisePropertyChanged 事件,我认为失去文本框焦点才是原因。你可能需要想办法在按下回车键后将焦点从文本框转移。 - Khan
请发布您的示例代码。 - Anand Murali
3个回答

6
默认情况下,TextBox 只有在失去焦点时才会更新与 Text 绑定的属性。你有两个选择,要么引起焦点变化(这可能会令用户感到烦恼),要么改变这种行为。
要改变这种行为,修改 TextBox 绑定的 UpdateSourceTrigger 属性为 PropertyChanged:
<TextBox Text={Binding Path=MyTextProperty, UpdateSourceTrigger=PropertyChanged}/>

这可能适用于您的情况,具体取决于每次属性更改所涉及的工作量。在某些情况下,这可能会显著降低性能。如果是这种情况,建议您重新设计视图模型代码,在属性更改时减少工作量。

3

我使用这种方法来完成此工作。只需将事件处理程序添加到您的 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();
        }
    }

这是一个更好的处理问题的方式,而不是更新我所有的属性绑定。 - NielW

0
我修改了blindmeis的答案,将焦点设置回最初拥有焦点的控件。
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();
}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接