Как мне привязать код к событию TextInput текстового поля Avalonia?

#c# #xaml #avaloniaui

#c# #xaml #avaloniaui

Вопрос:

У меня есть текстовое поле:

 <TextBox Text="{Binding Greeting}" TextInput="OnTextInput"/>
 

И я пытаюсь, как вы можете видеть, привязаться к TextInput событию, чтобы я мог что-то делать, когда пользователь вводит некоторый текст. Однако независимо от того, что я делаю, я получаю эту ошибку при привязке:

Не удалось найти подходящий установщик или сумматор для свойства TextInput типа Avalonia.Ввод: Avalonia.Ввод.Элемент ввода для системы аргументов.Частное.CoreLib:System.Строка, доступные списки параметров настройки: System.Обработчик событий `1[[Авалония.Ввод.TextInputEventArgs, Avalonia.Ввод, версия = 0.10.0.0, Культура = нейтральная, PublicKeyToken = c8d484a7012f9a8b]]

Я попытался определить метод, вызываемый OnTextInput в моей модели представления, а также в коде для представления, содержащего текстовое поле. Это выглядит так:

 public void OnTextInput(object sender, TextInputEventArgs e)
{
}
 

Я также пытался использовать RoutedEventArgs вместо TextInputEventArgs . Но что бы я ни делал, я все равно получаю эту ошибку. Как я могу настроить эту привязку, чтобы я мог что-то делать, когда пользователь вводит некоторый текст?

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

1. Попробуйте использовать Avalonia.Input.TextInputEventArgs e или using Avalonia.Input; . Это должно исправить ошибку, которую вы получаете.

2. Однако не стесняйтесь комментировать еще раз, потому что я думаю TextInput , что это не то, чего вы хотели бы достичь. Вместо этого я думаю, вы хотите проверить наличие измененного текста в вашей привязке. Я мог бы предоставить ответ на это…

3. Да, у меня есть using Avalonia.Input . Изменен текст в моей привязке? Как мне это сделать?

4. Ваш код работает для меня (компилируется без ошибок). Может быть, ваше окно неправильно привязано к вашему коду?

5. О, я вижу, обработчики событий должны входить в код, а не в модель представления. Не уверен, почему это не работало раньше, может быть, мне нужно было создать проект, чтобы они видели друг друга? Теперь я пытаюсь выяснить, как я могу заставить пользовательский интерфейс реагировать в ответ на ввод пользователя… Я не вижу никакого способа заставить что-то происходить в пользовательском интерфейсе из кода; должен быть какой-то способ получить доступ либо к элементам управления в пользовательском интерфейсе, либо к модели представления из этого контекста…

Ответ №1:

Найдя замену для еще не добавленного события TextChanged, о котором идет первоначальный вопрос, я нашел обходной путь, используя KeyUp (фактически событие нажатия клавиши), чтобы сделать то же самое. Я не использую MVVM, поскольку я просто создаю простую форму для использования в качестве замены WinForm. Это из кода моей формы входа:

 // This requires using Avalonia.Input; 
private void txtPassword_KeyPressUp(object sender, KeyEventArgs e) {
  if (txtPassword.Text == null)
     return;
  Password = txtPassword.Text;
  if (txtPassword.Text.Trim().Length > 6) {
     btnOK.IsEnabled = true;
  } else {
     btnOK.IsEnabled = false;
  }
}
 

Который находится в классе code-behind, файле LoginForm.axaml.cs. Определение LoginForm.axaml для текстового поля txtPassword выглядит следующим образом (axaml для кнопки не включен.):

 <TextBox x:Name="txtPassword" Watermark="Password..." PasswordChar="*"  Width="220" Height="36" KeyUp="txtPassword_KeyPressUp" />
 

За кулисами, в моем коде инициализации, я создаю элемент управления текстовым полем в коде и связываю его с элементом управления axaml (в качестве ссылки) с помощью этого фрагмента кода:

 NameScope thisWindowNameScope = (NameScope)this.FindNameScope();
txtPassword = (TextBox)thisWindowNameScope.Find("txtPassword");
 

Я отвечаю на это, главным образом потому, что мне бы хотелось увидеть это, когда я впервые нашел этот вопрос. Итак, после создания и тестирования приведенного выше кода я публикую его здесь, чтобы помочь кому-то еще. Как я уже говорил ранее, отличный фреймворк, дерьмовая документация. Честно говоря, он находится в стадии разработки, и я с нетерпением жду, когда оба стиля кодирования приведут достойные примеры. (MVVM не нужен, если это небольшая программа, большие программы — это другая история.)