输入按不会引发属性更改事件wpf

时间:2013-09-17 03:02:17

标签: c# wpf mvvm

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

谢谢!

3 个答案:

答案 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();
}));