C# 输入并按';t引发属性已更改的事件wpf

C# 输入并按';t引发属性已更改的事件wpf,c#,wpf,mvvm,C#,Wpf,Mvvm,在我看来,有一个文本框和一个按钮,文本框的文本属性绑定到ViewModel中的公共属性,当用户单击按钮时,获取文本框中的文本。我还将按钮的IsDefault属性设置为true,以便按enter键触发click事件。我的项目使用MVVM,因此按钮的命令也在ViewModel中。现在,问题是,我单击按钮,我可以在文本框中获取文本,但如果我按enter按钮,我无法获取文本,它总是空的。我设置了断点并发现,如果我在文本框中输入一些文本并单击按钮,RaisePropertyChanged事件将被触发,但如

在我看来,有一个文本框和一个按钮,文本框的文本属性绑定到ViewModel中的公共属性,当用户单击按钮时,获取文本框中的文本。我还将按钮的IsDefault属性设置为true,以便按enter键触发click事件。我的项目使用MVVM,因此按钮的命令也在ViewModel中。现在,问题是,我单击按钮,我可以在文本框中获取文本,但如果我按enter按钮,我无法获取文本,它总是空的。我设置了断点并发现,如果我在文本框中输入一些文本并单击按钮,RaisePropertyChanged事件将被触发,但如果我按下按钮,它不会被触发。 有人能帮忙吗


谢谢

默认情况下,
TextBox
仅在焦点丢失时更新绑定到
Text
的属性。您有两种选择,要么改变焦点(这可能会让用户感到恼火),要么改变这种行为

若要更改行为,请将文本框绑定的
UpdateSourceTrigger
属性修改为
PropertyChanged

<TextBox Text={Binding Path=MyTextProperty, UpdateSourceTrigger=PropertyChanged}/>


这可能适用于您,也可能不适用于您,这取决于您在每次属性更改中所做的工作量。在某些情况下,它会显著降低性能。如果是这种情况,我建议修改视图模型代码,以便在属性更改时减少工作量。

我使用这种方法来完成这项工作。只需将eventhandler添加到app.xaml.cs OnStartUp()中


我修改了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();
}));

我不相信按钮点击会导致
RaisePropertyChanged
事件,我相信是文本框失去焦点造成的。您可能需要找到一种方法来更改enter上文本框的焦点。发布示例代码这可能是一种更好的方法来处理问题,而不是更新所有my属性绑定。
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();
}));