Как определить, был ли текст изменен в текстовом поле программно или пользователем

#c# #wpf #uwp #textbox #textchanged

Вопрос:

Мы используем текстовое поле для отображения входных данных, полученных от системы ввода-вывода. Если пользователь введет некоторые данные в текстовое поле, значение будет записано в систему ввода-вывода.

Мы используем событие onTextChanged для записи данных, введенных пользователем, в систему ввода-вывода.

Проблема в том, что мы получаем это событие, когда обновляем значение, полученное от системы ввода-вывода, в текстовое поле (из кода).

Можно ли узнать, изменено ли значение текстового поля пользователем или с помощью кода?

Комментарии:

1. Используйте привязки и MVVM. Не принимайте во внимание логику.

2. Нет, мне нужно найти эту разницу в событии изменения текста для внутренних целей

3. Сравните текст с вашей моделью. Если это отличается, то это был пользовательский ввод

4. Или возьмите другое событие, например KeyDown

5. Это невозможно выяснить в обработчике TextChanged событий. Сделайте все, что вы хотите сделать, прежде чем устанавливать Text свойство программно?

Ответ №1:

Вы можете установить логическую переменную с именем IsUserInput, после того как система ввода-вывода отправит данные в текстовое поле, вам нужно установить значение IsUserInput в значение false. В KeyDown случае текстового поля переменная может быть установлена в значение true. Наконец, вы можете использовать эту переменную для определения ввода текста в textChanged событии.

Пожалуйста, обратитесь к следующему коду.

 public Boolean IsUserInput;

private void Button_Click(object sender, RoutedEventArgs e)
        {
            IsUserInput = false;
            myTextBox.Text = "hellohello";
          
        }

        private void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (IsUserInput)
            {
//write data to I/O sytem
            }
           
        }

private void myTextBox_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            IsUserInput = true;
        }