Xamarin表单密码和确认密码验证

时间:2015-07-17 10:06:55

标签: xamarin xamarin.forms xamarin-studio

我有一个Xamarin Forms申请表,我有一个注册表格,我需要在其中验证密码和确认密码字段应该是相同的。

有没有办法使用Xamarin Behaviour实现这个?

我已经为Xamarin Behaviour验证和Required Field验证实施了Email Regex,如下所示 -

public class RequiredValidatorBehavior : Behavior<Entry>
    {
        static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(RequiredValidatorBehavior), false);
        static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty;

        public bool IsValid
        {
            get { return (bool)base.GetValue(IsValidProperty); }
            private set { base.SetValue(IsValidPropertyKey, value); }
        }

        protected override void OnAttachedTo(Entry bindable)
        {
            bindable.Unfocused += HandleFocusChanged;
            base.OnAttachedTo(bindable);
        }
        protected override void OnDetachingFrom(Entry bindable)
        {
            bindable.Unfocused -= HandleFocusChanged;
            base.OnDetachingFrom(bindable);
        }
        void HandleFocusChanged(object sender, FocusEventArgs e)
        {
            IsValid = !string.IsNullOrEmpty (((Entry)sender).Text);
        }
    }

Behaviour -

中实施XAML Content Page
<Entry x:Name="password" Placeholder="New Password">
    <Entry.Behaviors>
        <local:RequiredValidatorBehavior x:Name="passwordValidator"/>   
    </Entry.Behaviors>
</Entry>

问题是 - 我是Xamarin开发的新手,并且不知道如何才能获得PasswordConfirm PasswordBehaviour字段的值,以便我可以比较它们。我不希望在提交表单时单击按钮来比较它们,应在用户键入字段时比较字段。任何代码,帮助或指导都是可观的。

4 个答案:

答案 0 :(得分:9)

https://forums.xamarin.com/discussion/34695/xaml-how-do-you-pass-a-control-view-reference-into-a-behavior

这会对你有所帮助。 您将使用Compare Validator行为,如下所示。

<behaviors:CompareValidator x:Name="ComparePasswordsValidator" 
        CompareToEntry="{Binding Source={x:Reference PasswordEntry}}" /> 

最后解决方案:

XAML -

<Entry x:Name="password" Placeholder="New Password" IsPassword="true">
    <Entry.Behaviors>
        <local:RequiredValidatorBehavior x:Name="passwordValidator"/>   
    </Entry.Behaviors>
</Entry>
<Entry x:Name="confirmPassword" Placeholder="Confirm Password" IsPassword="true">
    <Entry.Behaviors>
        <local:ConfirmPasswordBehavior x:Name="confirmPasswordBehavior" CompareToEntry="{Binding Source={x:Reference password}}" />
    </Entry.Behaviors>
</Entry>

行为 -

    public class ConfirmPasswordBehavior : Behavior<Entry>
    {
        static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(ConfirmPasswordBehavior), false);
        public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty;

        public static readonly BindableProperty CompareToEntryProperty = BindableProperty.Create("CompareToEntry", typeof(Entry), typeof(ConfirmPasswordBehavior), null);

        public Entry CompareToEntry
        {
            get { return (Entry)base.GetValue(CompareToEntryProperty); }
            set { base.SetValue(CompareToEntryProperty, value); }
        }
        public bool IsValid
        {
            get { return (bool)base.GetValue(IsValidProperty); }
            private set { base.SetValue(IsValidPropertyKey, value); }
        }
        protected override void OnAttachedTo(Entry bindable)
        {
            bindable.TextChanged += HandleTextChanged;
            base.OnAttachedTo(bindable);
        }
        protected override void OnDetachingFrom(Entry bindable)
        {
            bindable.TextChanged -= HandleTextChanged;
            base.OnDetachingFrom(bindable);
        }
        void HandleTextChanged(object sender, TextChangedEventArgs e)
        {
            var password = CompareToEntry.Text;
            var confirmPassword = e.NewTextValue;
            IsValid = password.Equals (confirmPassword);
        }
    }

答案 1 :(得分:3)

我对Punnet的答案做了一些修改:

首先,修复当可比较字符串为空时抛出的HandleTextChanged上的null异常

    void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        string theBase = CompareToEntry.Text;
        string confirmation = e.NewTextValue;
        // here is the change
        IsValid = (bool)theBase?.Equals(confirmation);

        ((Entry)sender).TextColor = IsValid ? Color.Green : Color.Red;
    }

第二个是检查验证变为真后是否更改了可比较的字符串。

    void baseValue_changed(object sender, TextChangedEventArgs e)
    {
        IsValid = (bool)((Entry)sender).Text?.Equals(thisEntry.Text);
        thisEntry.TextColor = IsValid ? Color.Green : Color.Red;
    }

所以新代码变成了

public class ComparisonBehavior : Behavior<Entry>
{
    private Entry thisEntry;

    static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(ComparisonBehavior), false);
    public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty;

    public static readonly BindableProperty CompareToEntryProperty = BindableProperty.Create("CompareToEntry", typeof(Entry), typeof(ComparisonBehavior), null);

    public Entry CompareToEntry
    {
        get { return (Entry)base.GetValue(CompareToEntryProperty); }
        set
        {
            base.SetValue(CompareToEntryProperty, value);
            if (CompareToEntry != null)
                CompareToEntry.TextChanged -= baseValue_changed;
            value.TextChanged += baseValue_changed;
        }
    }

    void baseValue_changed(object sender, TextChangedEventArgs e)
    {
        IsValid = ((Entry)sender).Text.Equals(thisEntry.Text);
        thisEntry.TextColor = IsValid ? Color.Green : Color.Red;
    }


    public bool IsValid
    {
        get { return (bool)base.GetValue(IsValidProperty); }
        private set { base.SetValue(IsValidPropertyKey, value); }
    }
    protected override void OnAttachedTo(Entry bindable)
    {
        thisEntry = bindable;

        if (CompareToEntry != null)
            CompareToEntry.TextChanged += baseValue_changed;

        bindable.TextChanged += HandleTextChanged;
        base.OnAttachedTo(bindable);
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        bindable.TextChanged -= HandleTextChanged;
        if (CompareToEntry != null)
            CompareToEntry.TextChanged -= baseValue_changed;
        base.OnDetachingFrom(bindable);
    }

    void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        string theBase = CompareToEntry.Text;
        string confirmation = e.NewTextValue;
        IsValid = (bool)theBase?.Equals(confirmation);

        ((Entry)sender).TextColor = IsValid ? Color.Green : Color.Red;
    }
}

答案 2 :(得分:2)

我开发了自定义控件来使用数据注释方法验证我们的模型。

这是项目网址。

https://github.com/MaulikParmar/XamarinForms/tree/master/ValidationDemo

它不适用于8.1窗口电话。

以下是项目说明的youtube网址以及如何更有效地使用此控件。

https://www.youtube.com/watch?v=eEi-Oky4U08

答案 3 :(得分:0)

如果你想添加异常处理,因为 System.InvalidOperationException 在输入密码之前先输入确认密码时显示错误。

void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        try
        {
            string theBase = CompareToEntry.Text;
            string confirmation = e.NewTextValue;
            IsValid = (bool)theBase?.Equals(confirmation);
            ((Entry)sender).TextColor = IsValid ? Color.FromHex("#e6a94d")/*correct*/ : Color.FromHex("#CD5C5C")/*incorrect*/;
        }
        catch (System.InvalidOperationException)
        {
            string theBase = CompareToEntry.Text;
            string confirmation = e.NewTextValue;
            ((Entry)sender).TextColor = IsValid ? Color.FromHex("#e6a94d")/*correct*/ : Color.FromHex("#CD5C5C")/*incorrect*/;
        }
    }