WPF 中 PasswordBox 的数据绑定

WPF中PasswordBox的Password属性不支持数据绑定(出于安全考虑),而在MVVM设计模式中又是必须的。

所以我们要增加一个Helper类来完成绑定。

 

代码转自:http://blog.csdn.net/oyi319/article/details/6551532

    /// <summary>  
    /// 为PasswordBox控件的Password增加绑定功能  
    /// </summary>  
    public static class PasswordBoxHelper  
    {  
        public static readonly DependencyProperty PasswordProperty =  
            DependencyProperty.RegisterAttached("Password",  
            typeof(string), typeof(PasswordBoxHelper),  
            new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));  
        public static readonly DependencyProperty AttachProperty =  
            DependencyProperty.RegisterAttached("Attach",  
            typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));  
        private static readonly DependencyProperty IsUpdatingProperty =  
           DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),  
           typeof(PasswordBoxHelper));  
  
        public static void SetAttach(DependencyObject dp, bool value)  
        {  
            dp.SetValue(AttachProperty, value);  
        }  
        public static bool GetAttach(DependencyObject dp)  
        {  
            return (bool)dp.GetValue(AttachProperty);  
        }  
        public static string GetPassword(DependencyObject dp)  
        {  
            return (string)dp.GetValue(PasswordProperty);  
        }  
        public static void SetPassword(DependencyObject dp, string value)  
        {  
            dp.SetValue(PasswordProperty, value);  
        }  
        private static bool GetIsUpdating(DependencyObject dp)  
        {  
            return (bool)dp.GetValue(IsUpdatingProperty);  
        }  
        private static void SetIsUpdating(DependencyObject dp, bool value)  
        {  
            dp.SetValue(IsUpdatingProperty, value);  
        }  
        private static void OnPasswordPropertyChanged(DependencyObject sender,  
            DependencyPropertyChangedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            passwordBox.PasswordChanged -= PasswordChanged;  
            if (!(bool)GetIsUpdating(passwordBox))  
            {  
                passwordBox.Password = (string)e.NewValue;  
            }  
            passwordBox.PasswordChanged += PasswordChanged;  
        }  
        private static void Attach(DependencyObject sender,  
            DependencyPropertyChangedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            if (passwordBox == null)  
                return;  
            if ((bool)e.OldValue)  
            {  
                passwordBox.PasswordChanged -= PasswordChanged;  
            }  
            if ((bool)e.NewValue)  
            {  
                passwordBox.PasswordChanged += PasswordChanged;  
            }  
        }  
        private static void PasswordChanged(object sender, RoutedEventArgs e)  
        {  
            PasswordBox passwordBox = sender as PasswordBox;  
            SetIsUpdating(passwordBox, true);  
            SetPassword(passwordBox, passwordBox.Password);  
            SetIsUpdating(passwordBox, false);  
        }  
    }  

 

然后在Xmal中PasswordBox可做如下绑定

 

    <PasswordBox heplers:PasswordBoxHelper.Attach="True" heplers:PasswordBoxHelper.Password="{Binding Path=Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。