Связывание TextBox и кнопки по умолчанию обновляется слишком поздно - PullRequest
30 голосов
/ 14 апреля 2010

У меня есть простой диалог WPF с этими двумя элементами управления:

<TextBox Text="{Binding MyText}"/>
<Button Command="{Binding MyCommand}" IsDefault="True"/>

Теперь, когда я ввожу некоторый текст в TextBox и нажимаю кнопку с помощью мыши, все работает как ожидалось: TextBox установит MyText и MyCommand будет вызван.

Но когда я ввожу какой-то текст и нажимаю клавишу ввода, чтобы «нажать» кнопку по умолчанию, он не работает. Поскольку при нажатии ввода фокус не покидает TextBox, привязка не будет обновляться MyText. Поэтому, когда вызывается MyCommand (который работает), MyText будет содержать старые данные.

Как мне это исправить в MVVM? В классическом коде позади я, вероятно, просто вызвал бы «MyButton.Focus ()» в обработчике MyCommand, но в MVVM обработчик MyCommand ничего не знает о кнопке.

Ну и что теперь?

Ответы [ 3 ]

42 голосов
/ 14 апреля 2010

Добавьте UpdateSourceTrigger в ваш TextBox со значением PropertyChanged. Поведение Textbox по умолчанию заключается в обновлении источника, когда он потерял фокус.

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
6 голосов
/ 22 января 2014

Попробуй это. Этот код перемещает фокус на нажатую кнопку. Таким образом, привязка завершается до обработки команды.

    public App()
    {
        EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(GenericButtonClickHandler));
    }

    void GenericButtonClickHandler(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        if (button == null)
            return;
        if (button.IsDefault)
            button.Focus();
    }
2 голосов
/ 28 октября 2011

Одно решение - создать свой собственный класс OKButton, который вызывает Me.Focus в OnClick-методе. Это будет вызвано перед Click_Event и перед любой Командой, связанной с кнопкой. Вы просто должны помнить, чтобы использовать кнопку OK вместо установки IsDefault = True

Public Class OKButton
  Inherits System.Windows.Controls.Button

  Public Sub New()
  MyBase.New()
  Me.Content = "OK"
  Me.IsDefault = True
  End Sub

  Protected Overrides Sub OnClick()
  Me.Focus()
  MyBase.OnClick()
  End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...