wpf关于PasswordBox的绑定Password的问题(MVVM框架)

 

当尝试数据绑定一个PasswordBox的密码属性,你会认识到,你不能做数据就可以了绑定。 这样做的原因是,该密码属性不是由DependencyProperty支持。

原因是数据绑定密码是不是一个好的设计,出于安全考虑,应该避免。 但有时这种安全是没有必要的,那么它不但麻烦,你不能绑定到Password属性。 在这种特殊情况下,你可以利用以下PasswordBoxBindingHelper的。

 <PasswordBox Name="pwdBoxPWD" 
                     tools:PasswordBoxBindingHelper.IsPasswordBindingEnabled="True" 
                     tools:PasswordBoxBindingHelper.BindedPassword= "{Binding Path=Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
                     HorizontalAlignment="Left"
                     Height="38" Margin="167,170,0,0"  PasswordChar="*" VerticalAlignment="Top" Width="258" FontSize="24" VerticalContentAlignment="Center" MaxLength="18" />

 

PasswordBoxBindingHelper通过调用PasswordBoxBindingHelper.BindedPasswordProperty附着到passwordbox。附加属性PasswordBoxBindingHelper.Password提供了PasswordBox控制的原始密码属性的拷贝PassWord用于绑定。

 

 

 1  public static class PasswordBoxBindingHelper
 2     {
 3         //BindedPassword
 4         public static readonly DependencyProperty BindedPasswordProperty =
 5             DependencyProperty.RegisterAttached("BindedPassword",
 6             typeof(string), typeof(PasswordBoxBindingHelper),
 7             new FrameworkPropertyMetadata(string.Empty, OnBindedPasswordChanged));
 8 
 9         public static string GetBindedPassword(DependencyObject dp)
10         {
11             return (string)dp.GetValue(BindedPasswordProperty);
12         }
13         public static void SetBindedPassword(DependencyObject dp, string value)
14         {
15             dp.SetValue(BindedPasswordProperty, value);
16         }
17 
18         private static void OnBindedPasswordChanged(DependencyObject sender,
19           DependencyPropertyChangedEventArgs e)
20         {
21             PasswordBox passwordBox = sender as PasswordBox;
22             if (passwordBox == null)
23             {
24                 return;
25             }
26             passwordBox.PasswordChanged -= PasswordChanged;
27 
28             if (!(bool)GetIsUpdating(passwordBox))
29             {
30                 passwordBox.Password = (string)e.NewValue;
31             }
32             passwordBox.PasswordChanged += PasswordChanged;
33         }
34 
35 
36         //IsPasswordBindingEnabled
37         public static readonly DependencyProperty IsPasswordBindingEnabledProperty =
38             DependencyProperty.RegisterAttached("IsPasswordBindingEnabled",
39             typeof(bool), typeof(PasswordBoxBindingHelper), new PropertyMetadata(false, IsPasswordBindingEnabled));
40         public static void SetIsPasswordBindingEnabled(DependencyObject dp, bool value)
41         {
42             dp.SetValue(IsPasswordBindingEnabledProperty, value);
43         }
44 
45         public static bool GetIsPasswordBindingEnabled(DependencyObject dp)
46         {
47             return (bool)dp.GetValue(IsPasswordBindingEnabledProperty);
48         }
49         private static void IsPasswordBindingEnabled(DependencyObject sender,
50            DependencyPropertyChangedEventArgs e)
51         {
52             PasswordBox passwordBox = sender as PasswordBox;
53 
54             if (passwordBox == null)
55                 return;
56 
57             if ((bool)e.OldValue)
58             {
59                 passwordBox.PasswordChanged -= PasswordChanged;
60             }
61 
62             if ((bool)e.NewValue)
63             {
64                 passwordBox.PasswordChanged += PasswordChanged;
65             }
66         }
67 
68         //IsUpdating
69         private static readonly DependencyProperty IsUpdatingProperty =
70            DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
71            typeof(PasswordBoxBindingHelper));
72 
73         private static bool GetIsUpdating(DependencyObject dp)
74         {
75             return (bool)dp.GetValue(IsUpdatingProperty);
76         }
77 
78         private static void SetIsUpdating(DependencyObject dp, bool value)
79         {
80             dp.SetValue(IsUpdatingProperty, value);
81         }
82 
83         private static void PasswordChanged(object sender, RoutedEventArgs e)
84         {
85             PasswordBox passwordBox = sender as PasswordBox;
86             SetIsUpdating(passwordBox, true);
87             SetBindedPassword(passwordBox, passwordBox.Password);
88             SetIsUpdating(passwordBox, false);
89         }
90     }
91 }

 

posted @ 2015-09-02 18:44  只做我自己  阅读(1227)  评论(0编辑  收藏  举报