android - 如何使用 MVVMCross 验证 Xamarin.Android 中的数字

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

我有一个使用 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";
                }
            }

        }

    }
 }

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

enter image description here

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

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

最佳答案

您的绑定(bind)有误,它们应该是 local:MvxBind="Text UserNumber"local:MvxBind="Text IncorrectNumber" 检查 docs .

除非你使用 Fody.PropertyChanged包(我建议您使用)您应该在 UserNumber 的 setter 中调用 this.RaisePropertyChanged(() => this.IncorrectNumber),即在 _userNumber = value; 之后code> 以便通知 View 某些属性 (IncorrectNumber) 已从 ViewModel 更改

更新

如@mrisek 所说,您还应该在 IncorrectNumber setter 中更改您的验证。 应该是这样的

public string IncorrectNumber => !string.IsNullOrEmpty(UserNumber) && int.TryParse(UserNumber, out int n) ? null : "电话号码不正确";

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

关于android - 如何使用 MVVMCross 验证 Xamarin.Android 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283777/

相关文章:

java - 对话框导致应用程序崩溃

android - ConstraintLayout android中的链接链

java - 如何获取其他应用程序的图标(Android)

android - 如何防止 BottomSheetDialogFragment 在导航到另一个 fragment 后关闭?

android - 事件点击 android.support.design.widget.NavigationView 上的项目

c# - 为什么 TextChanged 事件在此 Xamarin.Android 代码中不起作用?

c# - Xamarin.Android 显示当前时间

c# - asp.net core 2.0 发布生成大量 DLL

visual-studio-2017 - 如何为 Visual Studio 2017 社区启用 CodeLens

visual-studio-2015 - Microsoft Bot Framework,Visual Studio 2015和2017出现启动错误