如何使用 MVVMCross 验证 Xamarin.Android 中的数字
How to validate the number in Xamarin.Android with 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";
}
}
}
}
}
但由于某些原因,如果我在此区域键入非数字字符,则看不到错误消息。它应该出现在数字下方。
我是 MVVMCross 的新手,有点困惑。求助
更新。我添加了 fmaccaroni 建议的更改。
现在错误信息总是在这里。即使该区域仅包含数字。
你可以尝试这样实现:
int numb;
if (!int.TryParse(UserNumber, out numb) && UserNumber.Length != 0)
{
return "Incorrect phone number";
}
你的绑定是错误的,它们应该是 local:MvxBind="Text UserNumber"
和 local:MvxBind="Text IncorrectNumber"
检查 docs.
除非您使用 Fody.PropertyChanged 包(我建议您使用),否则您应该在 UserNumber 的 setter 内调用 this.RaisePropertyChanged(() => this.IncorrectNumber)
,即在 [=13= 之后] 为了通知视图某些 属性 (IncorrectNumber
) 已从 ViewModel
更改
更新
您还应该像@mrisek 所说的那样更改 IncorrectNumber
setter 中的验证。
应该是
public string IncorrectNumber => !string.IsNullOrEmpty(UserNumber) && int.TryParse(UserNumber, out int n) ? null : "Incorrect phone number" ;
如果你使用is
运算符,它会比较对象是否属于那个Type
,这不是很清楚。
顺便记住 Int32 的长度,如果你想要更大的数字,你应该使用 Int64 或使用 Regex 进行验证:Regex.IsMatch(UserNumber, @"^\d+$")
我有一个使用 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 的新手,有点困惑。求助
更新。我添加了 fmaccaroni 建议的更改。 现在错误信息总是在这里。即使该区域仅包含数字。
你可以尝试这样实现:
int numb;
if (!int.TryParse(UserNumber, out numb) && UserNumber.Length != 0)
{
return "Incorrect phone number";
}
你的绑定是错误的,它们应该是 local:MvxBind="Text UserNumber"
和 local:MvxBind="Text IncorrectNumber"
检查 docs.
除非您使用 Fody.PropertyChanged 包(我建议您使用),否则您应该在 UserNumber 的 setter 内调用 this.RaisePropertyChanged(() => this.IncorrectNumber)
,即在 [=13= 之后] 为了通知视图某些 属性 (IncorrectNumber
) 已从 ViewModel
更新
您还应该像@mrisek 所说的那样更改 IncorrectNumber
setter 中的验证。
应该是
public string IncorrectNumber => !string.IsNullOrEmpty(UserNumber) && int.TryParse(UserNumber, out int n) ? null : "Incorrect phone number" ;
如果你使用is
运算符,它会比较对象是否属于那个Type
,这不是很清楚。
顺便记住 Int32 的长度,如果你想要更大的数字,你应该使用 Int64 或使用 Regex 进行验证:Regex.IsMatch(UserNumber, @"^\d+$")