问题描述
<TextBox Text="{Binding Greeting}" TextInput="OnTextInput"/>
正如您所见,我正在尝试绑定到 TextInput
事件,以便在用户键入一些文本时我可以执行某些操作。但是,无论我做什么,我都会在绑定中收到此错误:
无法为参数 System.Private.CoreLib:System.String 的 Avalonia.Input:Avalonia.Input.InputElement 类型的属性 TextInput 找到合适的设置器或加法器,可用的设置器参数列表是: System.EventHandler`1[[Avalonia.Input.TextInputEventArgs,Avalonia.Input,Version=0.10.0.0,Culture=neutral,PublicKeyToken=c8d484a7012f9a8b]]
我尝试在我的视图模型上以及包含文本框的视图的代码隐藏上定义一个名为 OnTextInput
的方法。它看起来像这样:
public void OnTextInput(object sender,TextInputEventArgs e)
{
}
我也尝试使用 RoutedEventArgs
代替 TextInputEventArgs
。但是无论我做什么,我仍然会遇到那个错误。如何设置此绑定,以便在用户键入某些文本时可以执行某些操作?
解决方法
在寻找原始问题所涉及的尚未添加的 TextChanged 事件的替代品后,我找到了一种使用 KeyUp(实际上是 KeyPress 事件)来做同样事情的解决方法。我没有使用 MVVM,因为我只是在制作一个简单的 Form 来替代 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;
}
}
在代码隐藏类 LoginForm.axaml.cs 文件中。文本框txtPassword的LoginForm.axaml定义如下(不包括按钮的axaml。):
<TextBox x:Name="txtPassword" Watermark="Password..." PasswordChar="*" Width="220" Height="36" KeyUp="txtPassword_KeyPressUp" />
在幕后,在我的初始化代码中,我在代码中创建了一个 TextBox 控件,并通过以下代码片段将其链接到 axaml 控件(作为参考):
NameScope thisWindowNameScope = (NameScope)this.FindNameScope();
txtPassword = (TextBox)thisWindowNameScope.Find("txtPassword");
我回答这个问题,主要是因为当我第一次发现这个问题时,我很想看到这个。因此,在制作和测试上述代码后,我将其发布在这里以帮助其他人。就像我之前说过的,伟大的框架,蹩脚的文档。公平地说,它正在建设中,我期待看到两种编码风格都给出了不错的例子。 (如果是小程序,则不需要 MVVM,大型程序则不同。)