在 Avalonia 中对
TextBox进行正则表达式验证,核心思路是监听输入变化(如
TextChanged事件或绑定
Text属性),用正则判断当前文本是否合法,并通过 UI 反馈(如边框变色、显示提示)告知用户。Avalonia 本身不内置“正则验证器”控件,但实现起来很轻量。
监听 TextChanged 事件 + 正则匹配
这是最直接的方式,适合简单场景:
在 XAML 中给 TextBox 设置TextChanged事件处理函数 在后台代码中用
Regex.IsMatch(text, pattern)判断 匹配失败时设置
TextBox.Classes.Add("invalid"),并在 CSS 中定义 .invalid { border: 2px solid #e53935; }
可选:同步更新绑定的 ViewModel 属性(若使用 MVVM),或禁用提交按钮
绑定 Text 属性 + 在 ViewModel 中验证(推荐 MVVM)
更符合 Avalonia 推荐的 MVVM 模式:
将 TextBox 的Text绑定到 ViewModel 的字符串属性(如
UserName) 在该属性的 setter 中执行正则校验:
if (!Regex.IsMatch(value, @"^[a-zA-Z0-9_]{3,16}$")) throw new ArgumentException("用户名格式不合法");
搭配 INotifyDataErrorInfo接口,把错误信息暴露给视图,Avalonia 会自动响应并高亮控件(需启用
ValidationErrorsTemplate或自定义样式) 优点:逻辑集中、可测试、支持异步验证(如检查用户名是否已存在)
封装成可复用的验证行为(Behavior)
如果多个 TextBox 都需要类似验证,可以写一个
RegexValidationBehavior: 继承
Avalonia.Interactivity.Behavior<textbox></textbox>添加
Pattern和
ErrorMessage依赖属性 在
OnAttached中订阅
TextChanged,校验后触发
InvalidInput事件或设置
IsInvalid属性 XAML 中这样用:
<textbox behaviors:regexvalidationbehavior.pattern="^\d{11}$"></textbox>
CSS 样式反馈要配合使用
光有逻辑不够,UI 提示必须清晰:
定义.textbox-invalid { border-color: #d32f2f; } 和 .textbox-valid { border-color: #4caf50; }
在代码中动态增删 Class:textBox.Classes.Set(":invalid", !isValid);
可额外加 ToolTip显示错误原因,例如:
textBox.ToolTip = isValid ? null : "手机号必须为11位数字";
基本上就这些。不需要引入第三方库,.NET 内置
System.Text.RegularExpressions完全够用。关键是把验证时机(输入中/失焦后)、反馈方式(样式/提示/禁用操作)和架构风格(代码后台/MVVM/行为)按项目需要选好。
