Xamarin.Android结合MVVMCross数字输入验证问题求助
解决MVVMCross Xamarin.Android数字输入验证问题
嗨,我来帮你搞定这个数字验证的小问题~你现在遇到的核心问题是验证逻辑判断错误,导致错误提示要么不显示要么一直显示,咱们一步步来修复:
1. 修正ViewModel里的验证逻辑
你当前的IncorrectNumber属性判断用了UserNumber is Int16 || UserNumber is Int32,但UserNumber是字符串类型啊!is运算符是用来判断对象的实际类型,字符串永远不可能是整数类型,所以这个判断永远返回false,这就导致错误消息一直显示。
咱们换两种靠谱的验证方式:
方式一:尝试转换为数值类型(适合严格数字验证)
因为你设置了输入框的maxLength="10",用long.TryParse更合适(int的最大值是2147483647,10位数字可能超过这个范围):
public string IncorrectNumber { get { // 空输入时不显示错误 if (string.IsNullOrWhiteSpace(UserNumber)) { return null; } // 尝试将字符串转为长整数,成功则无错误 if (long.TryParse(UserNumber, out _)) { return null; } else { return "Incorrect phone number"; } } }
方式二:检查所有字符是否都是数字(适合手机号这类场景)
如果只是需要确保输入的全是数字,不需要严格转数值,可以用char.IsDigit来检查每个字符:
public string IncorrectNumber { get { if (string.IsNullOrWhiteSpace(UserNumber)) { return null; } // 检查字符串里的每个字符是否都是数字 if (UserNumber.All(char.IsDigit)) { return null; } else { return "Incorrect phone number"; } } }
2. 修复布局文件的小问题
你的布局里有两处小错误,会影响UI显示:
RelativeLayout标签没有闭合TextView重复写了android:layout_height- 建议加上
android:layout_below="@id/userNumber"让错误提示在输入框下方,避免重叠
修正后的布局代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/userNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLength="10" android:phoneNumber="true" local:MvxBind="Text UserNumber" /> <TextView android:id="@+id/incorrectNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="#F44336" android:layout_below="@id/userNumber" local:MvxBind="Text IncorrectNumber" /> </RelativeLayout>
3. 额外优化建议
- 如果你需要更精准的手机号验证(比如长度限制、开头数字规则),可以在判断里增加对应的条件,比如:
if (UserNumber.All(char.IsDigit) && UserNumber.Length == 10) { return null; } else { return "请输入有效的10位手机号码"; } - 你当前的
UserNumbersetter里已经调用了RaisePropertyChanged(() => this.IncorrectNumber),这样用户每输入一个字符都会触发验证,实时更新错误提示,这个逻辑是对的,不用改~
这样调整之后,输入非数字字符时错误提示会正常显示,输入纯数字时就会隐藏啦!
内容的提问来源于stack exchange,提问作者NaSt
相关产品推荐
相关产品推荐

