zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Socket编程基础——Socket选项
    Socket编程基础——无连接UDP
    Socket编程基础——面向连接TCP
    初探网络编程
    常用的正则表达式匹配
    iOS中的桥接方式
    iOS中的原生框架生成二维码
    iOS中的单例模式
    iOS
    iOS 中实现 快速归档 与 快速解档
  • 原文地址:https://www.cnblogs.com/spqqps/p/4779260.html
Copyright © 2011-2022 走看看