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); } } }