WPF: текстовое поле не срабатывает при событии TextInput

В общем, у меня есть куча текстовых полей, которые пользователь может заполнить. У меня есть кнопка, которую я хочу оставить отключенной, пока во все текстовые поля не будет введен текст. Вот пример XAML TextBox, который я использую:

<TextBox Name="DelayedRecallScore" TextInput="CheckTextBoxFilled" Width="24" />

И вот функция, которую я пытаюсь вызвать:

  //Disables the OK button until all score textboxes have content
    private void CheckTextBoxFilled(object sender, RoutedEventArgs e)
    {
        /*
        foreach (TextBox scorebox in TextBoxList)
        {
            if (string.IsNullOrEmpty(scorebox.Text))
            {
                Ok_Button.IsEnabled = false;
                return;
            }
        }
        Ok_Button.IsEnabled = true;
         */
        MessageBox.Show("THIS MAKES NO SENSE");
    }

MessageBox не отображается, когда должен запускаться TextInput. В качестве эксперимента я попытался запустить CheckTextBoxFilled() для PreviewTextInput, и тогда он работал нормально, а это означает, что по какой-то причине функция просто не вызывается. У меня также есть функция проверки, которая запускается PreviewTextInput и работает как надо. Сначала я подумал, что PreviewTextInput может каким-то образом мешать TextInput, поэтому я удалил PreviewTextInput с TextBox, но это ничего не помогло исправить. Я совершенно озадачен тем, почему это может произойти, поэтому любая помощь будет оценена по достоинству.


person Kay Ell    schedule 03.09.2009    source источник
comment
что случилось с многоадресными делегатами? почему бы ему не запустить назначенное пользователем событие в дополнение к своему собственному?   -  person Sonic Soul    schedule 24.05.2010


Ответы (4)


Ваш обработчик события TextInput не запускается, потому что TextBox обрабатывает событие. Вы можете попробовать использовать TextChanged событие, так как на самом деле вы просто хотите знать, когда символы были добавлены или удалены из TextBox.

person Andy    schedule 03.09.2009
comment
Я этого не знал, спасибо. Я просто подумал, что, поскольку PreviewTextInput работает таким образом, ничто не мешает TextInput работать таким же образом. TextChanged работает нормально. - person Kay Ell; 03.09.2009
comment
WPF действительно любит делать то, что должно быть простыми задачами, слишком сложными. Я имею в виду, зачем выставлять событие, если оно никогда не сработает? Смешно... да, я выдыхаюсь :D - person Ed S.; 15.04.2011
comment
@Ed FWIW, если вы создадите подкласс TextBox, вы сможете обработать это событие. Но я понимаю вашу точку зрения, тем не менее. - person Andy; 16.04.2011
comment
Да, всегда есть обходной путь, и в целом мне нравится WPF, просто меня столько раз кусали то, что должно быть простыми вещами, слишком сложными для фреймворка в этом недавнем проекте, что я немного ожесточился. - person Ed S.; 17.04.2011

Вместо этого используйте «PreviewTextInput», это сработает.

person Rankit    schedule 28.06.2017

Создайте новый класс, производный от TextBox. В новом классе переопределите метод OnTextInput. Ваш метод OnTextInput будет вызван до того, как его получит TextBox.

person user3801831    schedule 03.07.2014

person    schedule
comment
это не захватывает пространство. Событие не запускается. - person Mike; 30.01.2017