summaryrefslogtreecommitdiff
path: root/Gestor.Application/Helpers/PasswordBoxAssistant.cs
blob: 8944bc7f6fa413ef7dc17b59cc432856ef61b5e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Windows;
using System.Windows.Controls;

namespace Gestor.Application.Helpers
{
	public static class PasswordBoxAssistant
	{
		public readonly static DependencyProperty BoundPassword;

		public readonly static DependencyProperty BindPassword;

		private readonly static DependencyProperty UpdatingPassword;

		static PasswordBoxAssistant()
		{
			PasswordBoxAssistant.BoundPassword = DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordBoxAssistant), new PropertyMetadata(string.Empty, new PropertyChangedCallback(PasswordBoxAssistant.OnBoundPasswordChanged)));
			PasswordBoxAssistant.BindPassword = DependencyProperty.RegisterAttached("BindPassword", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false, new PropertyChangedCallback(PasswordBoxAssistant.OnBindPasswordChanged)));
			PasswordBoxAssistant.UpdatingPassword = DependencyProperty.RegisterAttached("UpdatingPassword", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false));
		}

		public static bool GetBindPassword(DependencyObject dp)
		{
			return (bool)dp.GetValue(PasswordBoxAssistant.BindPassword);
		}

		public static string GetBoundPassword(DependencyObject dp)
		{
			return (string)dp.GetValue(PasswordBoxAssistant.BoundPassword);
		}

		private static bool GetUpdatingPassword(DependencyObject dp)
		{
			return (bool)dp.GetValue(PasswordBoxAssistant.UpdatingPassword);
		}

		private static void HandlePasswordChanged(object sender, RoutedEventArgs e)
		{
			PasswordBox passwordBox = sender as PasswordBox;
			PasswordBoxAssistant.SetUpdatingPassword(passwordBox, true);
			PasswordBoxAssistant.SetBoundPassword(passwordBox, passwordBox.Password);
			PasswordBoxAssistant.SetUpdatingPassword(passwordBox, false);
		}

		private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
		{
			PasswordBox passwordBox = dp as PasswordBox;
			if (passwordBox == null)
			{
				return;
			}
			bool oldValue = (bool)e.OldValue;
			bool newValue = (bool)e.NewValue;
			if (oldValue)
			{
				passwordBox.PasswordChanged -= new RoutedEventHandler(PasswordBoxAssistant.HandlePasswordChanged);
			}
			if (newValue)
			{
				passwordBox.PasswordChanged += new RoutedEventHandler(PasswordBoxAssistant.HandlePasswordChanged);
			}
		}

		private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			PasswordBox passwordBox = d as PasswordBox;
			if (d == null || !PasswordBoxAssistant.GetBindPassword(d))
			{
				return;
			}
			passwordBox.PasswordChanged -= new RoutedEventHandler(PasswordBoxAssistant.HandlePasswordChanged);
			string newValue = (string)e.NewValue;
			if (!PasswordBoxAssistant.GetUpdatingPassword(passwordBox))
			{
				passwordBox.Password = newValue;
			}
			passwordBox.PasswordChanged += new RoutedEventHandler(PasswordBoxAssistant.HandlePasswordChanged);
		}

		public static void SetBindPassword(DependencyObject dp, bool value)
		{
			dp.SetValue(PasswordBoxAssistant.BindPassword, value);
		}

		public static void SetBoundPassword(DependencyObject dp, string value)
		{
			dp.SetValue(PasswordBoxAssistant.BoundPassword, value);
		}

		private static void SetUpdatingPassword(DependencyObject dp, bool value)
		{
			dp.SetValue(PasswordBoxAssistant.UpdatingPassword, value);
		}
	}
}