-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
534f642
commit 39b8a00
Showing
2 changed files
with
97 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
80 changes: 80 additions & 0 deletions
80
src/CodeSculpt.Wpf/AttachedProperties/PasswordBoxAssistant.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
using System.Windows; | ||
using System.Windows.Controls; | ||
|
||
namespace CodeSculpt.Wpf.AttachedProperties; | ||
public static class PasswordBoxAssistant | ||
{ | ||
public static readonly DependencyProperty BoundPassword = DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordBoxAssistant), new PropertyMetadata(string.Empty, OnBoundPasswordChanged)); | ||
public static readonly DependencyProperty BindPassword = DependencyProperty.RegisterAttached("BindPassword ", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false, OnBindPasswordChanged)); | ||
public static readonly DependencyProperty UpdatingPassword = DependencyProperty.RegisterAttached("UpdatingPassword", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false)); | ||
|
||
private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | ||
{ | ||
var box = d as PasswordBox; | ||
|
||
// only handle this event when the property is attached to a PasswordBox | ||
// and when the BindPassword attached property has been set to true | ||
if (d == null || !GetBindPassword(d)) | ||
{ | ||
return; | ||
} | ||
|
||
// avoid recursive updating by ignoring the box's changed event | ||
box!.PasswordChanged -= HandlePasswordChanged; | ||
|
||
var newPassword = (string)e.NewValue; | ||
|
||
if (!GetUpdatingPassword(box)) | ||
{ | ||
box.Password = newPassword; | ||
} | ||
|
||
box.PasswordChanged += HandlePasswordChanged; | ||
} | ||
|
||
private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e) | ||
{ | ||
// when the BindPassword attached property is set on a PasswordBox, | ||
// start listening to its PasswordChanged event | ||
|
||
if (dp is not PasswordBox box) | ||
{ | ||
return; | ||
} | ||
|
||
var wasBound = (bool)e.OldValue; | ||
var needToBind = (bool)e.NewValue; | ||
|
||
if (wasBound) | ||
{ | ||
box.PasswordChanged -= HandlePasswordChanged; | ||
} | ||
|
||
if (needToBind) | ||
{ | ||
box.PasswordChanged += HandlePasswordChanged; | ||
} | ||
} | ||
private static void HandlePasswordChanged(object sender, RoutedEventArgs e) | ||
{ | ||
var box = sender as PasswordBox; | ||
|
||
// set a flag to indicate that we're updating the password | ||
SetUpdatingPassword(box!, true); | ||
// push the new password into the BoundPassword property | ||
SetBoundPassword(box!, box!.Password); | ||
SetUpdatingPassword(box, false); | ||
} | ||
|
||
public static void SetBindPassword(DependencyObject dp, bool value) => dp.SetValue(BindPassword, value); | ||
|
||
public static bool GetBindPassword(DependencyObject dp) => (bool)dp.GetValue(BindPassword); | ||
|
||
public static string GetBoundPassword(DependencyObject dp) => (string)dp.GetValue(BoundPassword); | ||
|
||
public static void SetBoundPassword(DependencyObject dp, string value) => dp.SetValue(BoundPassword, value); | ||
|
||
private static bool GetUpdatingPassword(DependencyObject dp) => (bool)dp.GetValue(UpdatingPassword); | ||
|
||
private static void SetUpdatingPassword(DependencyObject dp, bool value) => dp.SetValue(UpdatingPassword, value); | ||
} |