#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 не нужен, если это небольшая программа, большие программы — это другая история.)