PasswordBoxHelper类实现
1 public class PasswordHelper 2 { 3 //password附加依赖属性 4 public static string GetPassword(DependencyObject obj) 5 { 6 return (string)obj.GetValue(PasswordProperty); 7 } 8 9 public static void SetPassword(DependencyObject obj, string value) 10 { 11 obj.SetValue(PasswordProperty, value); 12 } 13 14 public static readonly DependencyProperty PasswordProperty = 15 DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordHelper), new PropertyMetadata(null,new PropertyChangedCallback(OnPropertyChange))); 16 17 private static void OnPropertyChange(DependencyObject d, DependencyPropertyChangedEventArgs e) 18 { 19 var dp = d as PasswordBox; 20 //在属性值更改的时候会调用这个方法,这时不需要事件刷新 21 dp.PasswordChanged -= PasswordChanged; 22 23 var newvalue = e.NewValue.ToString(); 24 25 //判断控件的值和我们要给的值相等不,不相等才能赋值,判断的目的是在控件上输入值时会回调此方法,造成二次赋值 26 if (dp.Password != newvalue) 27 { 28 dp.Password = newvalue; 29 } 30 31 //通过属性更改完控件的值后再把控件的变化事件加上,监控控件的输入 32 dp.PasswordChanged += PasswordChanged; 33 34 35 } 36 37 /// <summary> 38 /// 控件输入发生变化时更改属性的值 39 /// </summary> 40 /// <param name="sender"></param> 41 /// <param name="e"></param> 42 private static void PasswordChanged(object sender, RoutedEventArgs e) 43 { 44 var pwd = sender as PasswordBox; 45 SetPassword(pwd, pwd.Password); 46 } 47 48 //这个附加属性的目的是初始化一个控件输入变化事件,来监听控件的输入 49 public static bool GetAttach(DependencyObject obj) 50 { 51 return (bool)obj.GetValue(AttachProperty); 52 } 53 54 public static void SetAttach(DependencyObject obj, bool value) 55 { 56 obj.SetValue(AttachProperty, value); 57 } 58 59 public static readonly DependencyProperty AttachProperty = 60 DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false,new PropertyChangedCallback(OnAttach))); 61 62 private static void OnAttach(DependencyObject d, DependencyPropertyChangedEventArgs e) 63 { 64 var pwd = d as PasswordBox; 65 var b = (bool)e.NewValue; 66 if (b) 67 { 68 pwd.PasswordChanged += PasswordChanged; 69 } 70 else 71 { 72 pwd.PasswordChanged -= PasswordChanged; 73 } 74 75 } 76 }
窗体控件的绑定
1 <Grid> 2 <StackPanel> 3 <PasswordBox Height="40" 4 Width="200" 5 Background="Orange" 6 VerticalAlignment="Top" 7 HorizontalAlignment="Left" 8 local:PasswordHelper.Attach="True" 9 local:PasswordHelper.Password="{Binding Password,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/> 10 <TextBox Height="30" Text="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 11 </StackPanel> 12 13 </Grid>