密码框密码不能绑定问题解决方案

想要扩展该控件时发现PasswordBox是一个密封类,是不可继承的。

故通过附加属性来实现该功能。

声明了两个附加属性

IsPasswordBindingEnabled:用来指示密码是否可用来绑定,当值发生改变时订阅或者取消订阅当Password改变时同步用于绑定的密码附加属性

BindedPassword:用于绑定的密码,与密码同步,当值发生改变是时与Password同步

 /// <summary>
    /// 扩展密码框密码可用于绑定的帮助类
    /// </summary>
    public class BindedPasswordHelper
    {
        #region 指示密码框的密码是否可以绑定的附加属性

        public static bool GetIsPasswordBindingEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsPasswordBindingEnabledProperty);
        }

        public static void SetIsPasswordBindingEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsPasswordBindingEnabledProperty, value);
        }

        public static readonly DependencyProperty IsPasswordBindingEnabledProperty =
            DependencyProperty.RegisterAttached("IsPasswordBindingEnabled", typeof(bool),
            typeof(BindedPasswordHelper),
            new UIPropertyMetadata(false, OnIsPasswordBindingEnabledChanged));

        private static void OnIsPasswordBindingEnabledChanged(DependencyObject obj,
                                                              DependencyPropertyChangedEventArgs e)
        {
            var passwordBox = obj as PasswordBox;

            if (passwordBox != null)
            {
                passwordBox.PasswordChanged -= PasswordBoxPasswordChanged;

                if ((bool)e.NewValue)
                {
                    passwordBox.PasswordChanged += PasswordBoxPasswordChanged;
                }

            }
        }

        //当密码发生改变时,更新用于绑定的密码
        private static void PasswordBoxPasswordChanged(object sender, RoutedEventArgs e)
        {
            var passwordBox = (PasswordBox)sender;

            if (!string.Equals(GetBindedPassword(passwordBox), passwordBox.Password))
            {
                SetBindedPassword(passwordBox, passwordBox.Password);
            }
        }

        #endregion

        #region 用于绑定的密码的附加属性

        public static string GetBindedPassword(DependencyObject obj)
        {
            return (string)obj.GetValue(BindedPasswordProperty);
        }

        public static void SetBindedPassword(DependencyObject obj, string value)
        {
            obj.SetValue(BindedPasswordProperty, value);
        }

        public static readonly DependencyProperty BindedPasswordProperty =
            DependencyProperty.RegisterAttached("BindedPassword", typeof(string),
            typeof(BindedPasswordHelper),
            new UIPropertyMetadata(string.Empty, OnBindedPasswordChanged));

        //当被绑定的密码更新时,更新密码
        private static void OnBindedPasswordChanged(DependencyObject obj,
                                                    DependencyPropertyChangedEventArgs e)
        {
            var passwordBox = obj as PasswordBox;
            if (passwordBox != null)
            {
                passwordBox.Password = e.NewValue == null ? string.Empty : e.NewValue.ToString();
            }
        }

        #endregion
    }

使用方法,这里要特别注意,与TextBox类似,一定要声明Mode已经UpdateSourceTrigger,不然绑定的值不会与后台的属性同步

    <PasswordBox Style="{StaticResource PasswordBoxStyle}"
                             helper:BindedPasswordHelper.IsPasswordBindingEnabled="True"
                             helper:BindedPasswordHelper.BindedPassword="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
时间: 2024-07-30 10:19:18

密码框密码不能绑定问题解决方案的相关文章

五、适合小白的小程序之密码框密码、*号显示隐藏

首先呢,还是先看看效果吧! 非可视密码下: 可视密码下: 到此呢,上正菜,为大家奉上. wxml下: 1 <view class='sameBox'> 2 <icon class='iconfont .icon-mima'></icon> 3 <input bindinput='passWordInput' name="passWord" type="{{typeName}}" placeholder='请输入密码'>

揭秘QQ 安全密码框的原理

这篇文章也算是朝花夕拾,其实很早以前就知道的原理,现在拿出来和大家交流分享一下. 故事总要有缘由,那么这个故事的缘由就是,当我以前写了一个获取其它进程密码框密码的时候(前几篇博客中有描述),我抱着试一试的心情去试探了一下能不能得到 QQ 的密码,当我抓到密码框的句柄,然后输入给程序的时候,结果令人失望,并没有任何结果,或许这根本就是一个假的密码框.这便激发了我的兴趣,便有了这次探究. QQ 的安全密码框果然是下了功夫的.网上搜索相关内容,才发现,以前腾讯用了韩国的技术来保证密码的安全性,但由于涉

[WPF]实现密码框的密码绑定

正如绑定TextBox控件的Text属性一样, 我们希望能够将PasswordBox空间的Password属性进行绑定, 比如在MVVM模式中,这似乎是必须的, 但可惜的是, Password属性是不支持绑定的(不是依赖属性, 也没有实现INotifyPropertyChanged). 这可能是出于安全性的考虑. 但在我们的系统为了实现View层密码框中的密码与后台其它层之间的密码属性之间的绑定, 可以采取如下思路: 将密码框的密码和某一个缓冲区进行同步, 缓冲区在和后台进行绑定. 其中密码框与

WPF自定义控件之水印文本(密码)框

首先来讲讲创建这个控件的初衷,一个让我很郁闷的问题. 公司的客户端项目采用WPF+MVVM技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码框是WPF原生的PasswordBox,这似乎没有什么不对.出现这个情况的一般是在xp系统(ghost的雨林木风版本或番茄花园),某些xp系统又不会出现. 出现这个问题的原因是因为客户的系统缺少PasswordBox使用的某种默认的字体,网上有人说是times new roman,又或者其它某种字体

360浏览器将密码框显示成明文密码问题解决

很早之前360浏览器就出现了把密码框显示成了明文,因自己的电脑一直没出现这样的bug无从下手,今天又出现了这个问题, 只有网上寻求解决方案,密码框使用了html5的属性placeholder和jquery.placeholder.min.js: <input class="input-large span12" name="password" id="password" type="password" placehold

iOS密码框的实现方式

说一下密码加密的实现方式 效果图: 实现方式: 主要说一下密码框的实现,这个密码框中间的四个数字其实是4个 UITextField ,然后通过键盘删除键 和TextFiled 的协议shouldChangeCharactersInRange.来判断输入的位置,代码如下: 直接上代码: // //  IDSGameRoomSecretView.h // //  Created by levi.duan on 2017/7/18. //  Copyright ? 2017年 Near. All ri

实现密码框默认文字效果实例代码

实现密码框默认文字效果实例代码:大家都知道很多文本框在默认情况下都有默认的提示文本,例如"请输入姓名"之类的语言,当点击文本框的时候,会清除提示语,比较人性化.但是在密码框中实现此效果可能就有点麻烦了,因为密码框不是以明文显示的,下面就介绍一下代码实例解决此问题.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="

Android 判断EditView是否为密码框

最近在做项目的时候需自动判断,一个登陆页面中EditView是否为密码框,我们可以使用inPutType属性来判断,我们可以利用getInputType()来判断,getInputType == 129时EditView就是一个密码框.

iOS密码框实现(二)取消确定按钮

由于将确定按钮去掉了,所以需要重新修改下代码,当输入第四个数字时,自动进入房间. iOS 密码框效果图: 实现方式: 首先声明一个block初始化方法,因为这只是个框框,并不需要处理网络请求等等,需要提供一个block给调用方,调用方利用block 去拿到密码,利用密码做一些开房间等操作. 利用计时器通过0.2秒来看清输入第四位密码,用户输入4位密码后自动进入下一步操作. 1.头文件需要定义: @classIDSGameRoomSecretView; typedefvoid(^selfhandl