【问题标题】:How to validate the number in Xamarin.Android with MVVMCross如何使用 MVVMCross 验证 Xamarin.Android 中的数字
【发布时间】:2018-01-16 14:42:29
【问题描述】:

我有使用 MVVMCross 的 Xamarin.Android 项目。我使用 Visual Studio。

Windows 10 64 Pro
Visual Studio 2017

我需要为数字输入创建文本区域并集成基本验证(这是一个数字吗?)如果出现错误,用户应该看到错误消息。

我已经创建了这些元素的布局。数字和错误消息的区域。

<?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"

<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_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:textColor="#F44336"
        local:MvxBind="Text IncorrectNumber" />

这里是NumberViewModel.cs

using MvvmCross.Platform.Converters;
using System;
using System.Collections.Generic;
using System.Globalization;
using My.project.Core.Models;

namespace My.project.Core.ViewModels
{
    class NumberViewModel : BaseViewModel
    {
        private string _userNumber;
        private string _incorrectNumber;

        public string UserNumber
        {
            get
            {
                return _userNumber;
            }
            set
            {
                _userNumber = value;
                this.RaisePropertyChanged(() => this.UserNumber);
                this.RaisePropertyChanged(() => this.IncorrectNumber);
            }
        }

        public string IncorrectNumber
        {
            get
            {
                if (UserNumber is Int16 || UserNumber is Int32) 
                {
                    return null;
                }
                else
                {
                    return "Incorrect phone number";
                }
            }

        }

    }
 }

但由于某种原因,如果我在此区域输入非数字字符,我将看不到错误消息。它应该出现在数字下方。

我是 MVVMCross 的新手,有点困惑。请帮忙

UPD。我添加了 fmaccaroni 建议的更改。 现在错误消息总是在这里。即使该区域仅包含数字。

【问题讨论】:

    标签: android xamarin.android visual-studio-2017 mvvmcross


    【解决方案1】:

    您的绑定错误,它们应该是local:MvxBind="Text UserNumber"local:MvxBind="Text IncorrectNumber",检查docs

    除非您使用Fody.PropertyChanged 包(我建议您使用),否则您应该在 UserNumber 的设置器中调用this.RaisePropertyChanged(() =&gt; this.IncorrectNumber),即在_userNumber = value; 之后,以便通知视图某些属性(@ 987654327@) 已从 ViewModel 更改

    更新

    您还应该按照@mrisek 所说的那样更改IncorrectNumber setter 中的验证。 应该是这样的

    public string IncorrectNumber =&gt; !string.IsNullOrEmpty(UserNumber) &amp;&amp; int.TryParse(UserNumber, out int n) ? null : "Incorrect phone number" ;

    如果您使用is 运算符,它会比较对象是否属于那个不清楚的Type。 顺便记住 Int32 的长度,如果你想要更大的数字,你应该使用 Int64 或使用正则表达式进行验证:Regex.IsMatch(UserNumber, @"^\d+$")

    【讨论】:

    • 谢谢!我修复了我的代码并对其进行了测试。现在错误消息总是在这里。即使该区域仅包含数字。 (我在帖子中添加代码更改)
    • 您在 UserNumber 设置器中缺少 this.RaisePropertyChanged(() =&gt; this.IncorrectNumber),即在 this.RaisePropertyChanged(() =&gt; this.UserNumber); 之后。这个 RaisePropertyChanged 会让视图知道IncorrectNumber 发生了变化,因此它将再次进入get 更新您的视图。顺便说一句,当您从未设置过 IncorrectNumber 时,您不需要设置器
    • 好吧,我做到了。但是错误仍然存​​在。即使该区域仅包含数字,我也能看到它。也许,转换器有问题?
    • @NaSt 使用 IncorrectNumber 验证更新了答案
    • 是的,它有效!谢谢!最后一个问题:起初,文本区域是空的,IncorrectNumber 显示错误。如何为空 UserNumber 添加例外?
    【解决方案2】:

    你可以尝试这样实现:

    int numb;
    if (!int.TryParse(UserNumber, out numb) && UserNumber.Length != 0) 
    {
        return "Incorrect phone number";
    }
    

    【讨论】:

    • 此解决方案有效!只有一个问题。起初,文本区域是空的,并且 IncorrectNumber 向我显示了错误。如何为空 UserNumber 添加例外?
    • 我编辑了我的答案,因此如果输入的长度为零,则不会显示错误消息。
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多