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