3

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

谢谢!

4

3 回答 3

5

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

要更改行为,UpdateSourceTrigger请将 TextBox 绑定的属性修改为PropertyChanged

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

这可能对您有用,也可能对您不起作用,具体取决于您对每个属性更改所做的工作量。在某些情况下,它会显着降低性能。如果是这种情况,我建议在属性更改时重新编写视图模型代码以减少工作量。

于 2013-09-17T03:14:53.553 回答
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();
        }
    }
于 2013-09-17T10:43:31.600 回答
0

我已经修改了盲人的答案,将焦点重新设置为最初具有焦点的控件。

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();
}));
于 2016-07-22T01:49:36.370 回答