Johny Corbie
Johny Corbie

Reputation: 63

WPF PasswordChanged property not detecting backspace delete

I'm using passwordchanged property in passwordbox:

 PasswordChanged="NewPWBox_PasswordChanged"

For detecting "real-time" change in password and update my other control which shows how much complex password is. It works just fine.

Only problem is when i mark whole text and delete it with backspace it dont detect change in string and my others control wont update.

I'm really not an frontend guy and couldn't find solution anywhere for this problem.

My function to show complexity of pasword:

private void NewPWBox_PasswordChanged(object sender, RoutedEventArgs e)
    {

        string NewPass = NewPWBox.Password;

        PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(NewPass);

        switch (passwordStrengthScore)
        {
            case PasswordScore.VeryWeak:

                if(passwordStrengthScore == PasswordScore.VeryWeak)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Weak_Grid.Visibility = Visibility.Hidden;
                Weak_Label.Visibility = Visibility.Hidden;
                Medium_Grid.Visibility = Visibility.Hidden;
                Medium_Label.Visibility = Visibility.Hidden;
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Weak:

                if(passwordStrengthScore == PasswordScore.Weak)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Medium_Grid.Visibility = Visibility.Hidden;
                Medium_Label.Visibility = Visibility.Hidden;
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Medium:

                if(passwordStrengthScore == PasswordScore.Medium)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Strong:

                if(passwordStrengthScore == PasswordScore.Strong)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                    Strong_Grid.Visibility = Visibility.Visible;
                    Strong_Label.Visibility = Visibility.Visible;
                }

                //hide others
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.VeryStrong:

                if(passwordStrengthScore == PasswordScore.VeryStrong)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                    Strong_Grid.Visibility = Visibility.Visible;
                    Strong_Label.Visibility = Visibility.Visible;
                    VS_Grid.Visibility = Visibility.Visible;
                    VS_Label.Visibility = Visibility.Visible;
                }
                break;
        }
    }

Here how it counts complexity:

    public enum PasswordScore
    {
        Blank = 0,
        VeryWeak = 1,
        Weak = 2,
        Medium = 3,
        Strong = 4,
        VeryStrong = 5
    }

    public class PasswordAdvisor
    {

        public static PasswordScore CheckStrength(string password)
        {
            int score = 1;
            if (password.Length < 1)
                return PasswordScore.Blank;
            if (password.Length < 4)
                return PasswordScore.VeryWeak;

            if (password.Length >= 8)
                score++;
            if (password.Length >= 12)
                score++;
            if (Regex.IsMatch(password, @"[0-9]+(\.[0-9][0-9]?)?", RegexOptions.ECMAScript))   //number only //"^\d+$" if you need to match more than one digit.
                score++;
            if (Regex.IsMatch(password, @"^(?=.*[a-z])(?=.*[A-Z]).+$", RegexOptions.ECMAScript)) //both, lower and upper case
                score++;
            if (Regex.IsMatch(password, @"[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]", RegexOptions.ECMAScript)) //^[A-Z]+$
                score++;
            return (PasswordScore)score;
        }

I dont think you need it but just to be sure if i didnt miss anything.

Any ideas guys?

Thanks and best regards,

John

Upvotes: 0

Views: 158

Answers (1)

DrkDeveloper
DrkDeveloper

Reputation: 949

After all chatty comments: Put a default case in your switch and hide controls in that case.

Edit: It will be nice if you cut the number of controls to one rectangle and one label and change the color (and the size if you want, or gradientbrush...) and the text of the label... And hide if empty password box.

It's so easy, clean, future proof and more decoupled with binding and validations...

Upvotes: 1

Related Questions