Xamarin 社区工具包 InputValidation 与按钮连接

问题描述

我有一个简单的表单,用户可以在其中添加电子邮件

                       <Entry Placeholder="Email" Text="{Binding Email}">
                            <Entry.Behaviors>
                                <xct:MultiValidationBehavior >
                                    <xct:EmailValidationBehavior  Flags="ValidateOnUnfocusing"/>
                                </xct:MultiValidationBehavior>
                            </Entry.Behaviors>
                        </Entry>

还有一个按钮:

     <Button Text="Send" Command="{Binding LoadSendRegistrationCommand}" TextColor="#07987f"  BackgroundColor="#eeeeee"  Margin="0,10,10"></Button>

当点击按钮时,如果电子邮件无效,如何检查和返回消息?

解决方法

(一如既往)有多种方法可以做到这一点。如果您只想在没有 MVVM/数据绑定的情况下从代码隐藏中执行此操作,您仍然有两个选择。

由于您使用的是 MultiValidationBehavior,因此您可以为其指定一个 x:Name="myValidation" 属性并从您的代码隐藏中访问该属性。然后,您将能够:

1.通过MultivalidationBehavior

if (!myValidation.IsValid)
{
    // Somehow show the errors,this needs some extra code,but you get the idea :)
    DisplayAlert("Error",myValidation.Errors,"OK");
}

此外,您可能希望在 MultivalidationBehavior.Error 上指定 EmailValidationBehavior 属性,即:

<xct:EmailValidationBehavior xct:MultiValidationBehavior.Error="Email not valid" Flags="ValidateOnUnfocusing"/>

2.通过EmailValidationBehavior

您也可以直接使用 EmailValidationBehavior 来完成。为此,向您的 x:Name="myEmailValidation" 添加一个 EmailValidationBehavior 属性,您可以在代码隐藏中访问它:

if (!myEmailValidation.IsValid)
{
    DisplayAlert("Error","Email not valid","OK");
}
else
{
    DisplayAlert("Success","All valid!","OK");
}

3.通过数据绑定

我实际上注意到,在键入所有这些内容时,您确实使用了带有 Command 的数据绑定用于该按钮和电子邮件的值。在这种情况下,您还可以绑定到 IsValidEmailValidationBehavior 上的 MultiValidationBehavior 属性,然后根据此将某些 UI 元素切换为可见或不可见。

为此,我们需要做一些事情。我将专注于 EmailValidationBehavior,我相信您可以为 MultiValidationBehavior 找到答案。

  1. 将绑定添加到您的 EmailValidationBehavior<xct:EmailValidationBehavior IsValid="{Binding EmailValid}" Flags="ValidateOnUnfocusing"/>

  2. BindingContext 中的对象添加支持属性:

private bool emailValid;

public bool EmailValid
{
    get => emailValid;
    set
    {
        emailValid = value;
        OnPropertyChanged();
     }
}
  1. 添加 UI 元素以指示用户。当然,这也可能是禁用按钮或其他东西。 <Label Text="Email not valid" TextColor="Red" IsVisible="{Binding EmailValid,Converter={StaticResource invertBoolConverter}}" />

请注意,我还需要使用 Toolkit 中的 InvertedBoolConverter 来反转 IsValid 中的值以正确处理 IsVisibleLabel

  1. 添加转换器
<ContentPage.Resources>
    <ResourceDictionary>
        <xct:InvertedBoolConverter x:Key="invertBoolConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

应该是这样:)

可以在此处找到包含所有这些代码的工作示例:https://github.com/jfversluis/XCTInputValidationCodeBehindSample

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...