【问题标题】:How do I bind code to the TextInput event of an Avalonia TextBox?如何将代码绑定到 Avalonia TextBox 的 TextInput 事件?
【发布时间】:2021-02-13 02:24:46
【问题描述】:

我有一个文本框:

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

如您所见,我正在尝试绑定到TextInput 事件,以便在用户键入一些文本时我可以做一些事情。但是无论我做什么,我都会在绑定时收到此错误:

无法为参数 System.Private.CoreLib:System.String 的 Avalonia.Input:Avalonia.Input.InputElement 类型的属性 TextInput 找到合适的 setter 或 adder,可用的 setter 参数列表有: 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。但无论我做什么,我仍然会得到那个错误。如何设置此绑定,以便在用户键入文本时执行某些操作?

【问题讨论】:

  • 尝试使用Avalonia.Input.TextInputEventArgs eusing Avalonia.Input;。这应该可以解决您遇到的错误。
  • 但是请随时再次发表评论,因为我认为TextInput 不是您想要实现的。相反,我认为您想检查绑定上的更改文本。我可以提供一个答案...
  • 是的,我有using Avalonia.Input。更改了我的装订文本?我该怎么做?
  • 你的代码对我有用(编译没有错误)。也许您的 Window 未正确附加到您的 CodeBehind?
  • 哦,我明白了,事件处理程序需要进入后面的代码,而不是视图模型。不知道为什么以前不起作用,也许我需要构建项目让他们看到对方?现在我正在尝试弄清楚如何使 UI 响应用户输入...必须有某种方法可以访问 UI 中的控件或从此上下文中的视图模型...

标签: c# xaml avaloniaui


【解决方案1】:

在为原始问题所涉及的尚未添加的 TextChanged 事件寻找替代方法后,我找到了一种使用 KeyUp(实际上是 KeyPress 事件)来做同样事情的解决方法。我没有使用 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;
  }
}

位于代码隐藏类 LoginForm.axaml.cs 文件中。文本框 txtPassword 的 LoginForm.axaml 定义如下(不包括按钮的 axaml。):

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

在幕后,在我的初始化代码中,我在代码中创建了一个 TextBox 控件,并通过此代码 sn-p 将其链接到 axaml 控件(作为参考):

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

我正在回答这个问题,主要是因为当我第一次发现这个问题时,我很想看到这个。因此,在制作并测试了上述代码之后,我将其发布在这里以帮助其他人。就像我之前说的,很棒的框架,糟糕的文档。公平地说,它正在建设中,我期待看到这两种编码风格都给出了不错的例子。 (如果是小程序就不需要 MVVM,大程序就另当别论了。)

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2018-11-09
    • 1970-01-01
    • 2012-02-27
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多