群星之主WPF支持绑定的密码框

副标题:让WPF密码框支持绑定
介绍
【群星之主WPF支持绑定的密码框】喜欢WPFMVVM数据绑定的人 , 都知道 , 绑定功能是一个及其强大 , 并让人开心的功能 。 但是好多新手 , 在做一个99%的系统都需要登录功能时 , 居然遇到了一个非常奇葩的问题 。 密码框居然不能绑定 。 对 , 不能绑定!!!这就尴尬了 , 不是说要前后台分离么 , 为啥这个地方要给我当头一棒 , 啊啊啊啊啊啊啊啊 。
必应了一波 , 找到了一个大概的原因 。 好像是因为微软为了安全 , 特意没有为PwsswordBox的Password添加依赖属性 , 听说是因为绑定的话 , 密码是明文的 。 然而这有什么用么 , 反正最终你还是要通过网络把密码传出去 , 在那个地方不一样可以获取到密码嘛 。 所以啊 , 我们干脆点 , 你没有依赖属性 , 我给你加一个不就好了 。 哈哈哈哈哈哈哈!!!!
具体代码
群星之主WPF支持绑定的密码框
文章图片
usingSystem.Windows;
usingSystem.Windows.Controls;
namespaceWPF自定义密码绑定框
{
///<summary>
///密码绑定的帮助类
///</summary>
publicclassBindPasswordBox
{
privatestaticbool_updating=false;
///<summary>
///BindPassword依赖属性
///</summary>
publicstaticreadonlyDependencyPropertyBindPasswordProperty=
DependencyProperty.RegisterAttached(''BindPassword'',
typeof(string),
typeof(BindPasswordBox),
newFrameworkPropertyMetadata(string.Empty,OnBindPasswordChanged));
///<summary>
///获取密码
///</summary>
publicstaticstringGetBoundPassword(DependencyObjectdependencyObject)
{
return(string)dependencyObject.GetValue(BindPasswordProperty);
}
///<summary>
///设置密码
///</summary>
publicstaticvoidSetBindPassword(DependencyObjectdependencyObject,stringvalue)
{
dependencyObject.SetValue(BindPasswordProperty,value);
}
///<summary>
///密码改变事件
///</summary>
privatestaticvoidOnBindPasswordChanged(
DependencyObjectd,
DependencyPropertyChangedEventArgse)
{
PasswordBoxpassword=dasPasswordBox;
if(password!=null)
{
//禁用密码改变事件
password.PasswordChanged-=PasswordChanged;
}
if(e.NewValue!=null)
{
if(!_updating)
{
password.Password=e.NewValue.ToString();
}
}
else
{
password.Password=string.Empty;
}
//启用密码改变事件
password.PasswordChanged+=newRoutedEventHandler(PasswordChanged);
}
///<summary>
///密码改变事件
///</summary>
staticvoidPasswordChanged(objectsender,RoutedEventArgse)
{
PasswordBoxpassword=senderasPasswordBox;
if(password!=null)
{
_updating=true;
SetBindPassword(password,password.Password);
_updating=false;
}
}
}
}
示例程序
使用它也很简单 , 只要在XAML添加xmlns:local=''clr-namespace:WPF自定义密码绑定框''就好了 。 对了 , 我用的MvvmLight,所以还需要在nuget中引用 。 另外 , 不要忘记添加DataContext=''{BindingSource={StaticResourceLocator},Path=Main}''哦 , 不然的话 , 有的小伙伴就不会用了 。


推荐阅读