You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位手机号码";
    }
    
  • 你当前的UserNumber setter里已经调用了RaisePropertyChanged(() => this.IncorrectNumber),这样用户每输入一个字符都会触发验证,实时更新错误提示,这个逻辑是对的,不用改~

这样调整之后,输入非数字字符时错误提示会正常显示,输入纯数字时就会隐藏啦!

内容的提问来源于stack exchange,提问作者NaSt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:22:46