李大军

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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>

 

posted on 2021-09-02 11:27  李大军  阅读(765)  评论(0编辑  收藏  举报