win10 uwp 绑定密码
win10 下,密码框无法绑定到ViewModel,Password是不可以绑定。
我们可以自己使用简单方法去绑定
我们之前在WPF 使用绑定密码框,我写了一篇,关于如何绑定,我提供一个我自己试了可以的类。
首先,我们新建一个类,这个类是让 PasswordBox 可以绑定Password。
UWP让 PasswordBox 可以绑定Password 的一个方法,其实我使用的和之前一样。
我们新建静态类,附件属性,只是和之前有的小不一样。
我们先写一个函数PasswordChanged这个函数是 Password 变化使用的,我们先判断sender 是不是 PasswordBox ,是的话我们就通知密码改变。
通知使用SetPassword(passwordBox, passwordBox.Password);我们要先更新password,然后更新界面,但是我们设置password,会自动更新界面,一旦界面更新又更新 password,这样不好,我们需要设置 Updateing,如果是 true,就是我们界面更新,直接更新 password 。如果是 false,那么是 password 更新界面。于是我们在 PasswordChanged ,修改依赖属性,必须添加是否后台修改密码 IsUpdating ,如果是后台添加就需要设置他为 true,目的是可以让前台修改通知,后台修改忽略,不然出现无限循环就不好。
SetIsUpdating(passwordBox, true);
SetPassword(passwordBox, passwordBox.Password);
SetIsUpdating(passwordBox, false);
然后写private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
这个函数是我们定义的一个属性变化时,判断 sender 是不是 PasswordBox ,是的话,因为我们绑定是双向,所以先把passwordBox.PasswordChanged -= PasswordChanged取消,然后判断是不是更新了,如果更新了,也就是完成更新if (!(bool)GetIsUpdating(passwordBox))我们就把新的Value给passwordBox.Password,不管有没更新,我们需要passwordBox.PasswordChanged += PasswordChanged
private static void OnPasswordPropertyChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
if (passwordBox != null)
{
passwordBox.PasswordChanged -= PasswordChanged;
if (!(bool)GetIsUpdating(passwordBox))
{
passwordBox.Password = (string)e.NewValue;
}
passwordBox.PasswordChanged += PasswordChanged;
}
}
我们还需要一个Attach判断用户是不是要绑定,如果是 false ,就是和原来,不绑定
我们需要判断 sender 是 PasswordBox ,好像不是的话我们不需要做下,因为都是静态,使用事件绑定,用的是 sender ,关于 Sender 和 Origin 其实是不同的,不过在这里就使用 sender,不是路由事件。
我们判断,在使用 OldValue 是不是true,如果是的话,我们先把passwordBox.PasswordChanged -= PasswordChanged,不是的话不能passwordBox.PasswordChanged -= PasswordChanged ,因为之前不是已经添加了,所以不可以再移除,即使添加了,也不会出错。这样在修改密码就可以通过函数知道密码已经修改,通过已经修改的密码更新到附加属性,就可以让附加属性得到密码,绑定附加属性,就可以让vm得到值,于是这个核心就是这么简单。
判断NewValue,如果是true,passwordBox.PasswordChanged += PasswordChanged;,这时就是绑定了,以后修改了密码就可以知道了。
代码可以复制到一个文件,注意需要使用他所在的name,使用xmlns引用需要用到
public static class PasswordBoxHelper
{
public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached(
"Password", //属性
typeof(string),//属性的类型
typeof(PasswordBoxHelper), //属于的类,我们做的是静态,所以需要这个让附加属性可以知道他所在,我们到时可以使用 sender 拿到实例,所以需要知道他的类可以转
new PropertyMetadata(default(string),//默认值
OnPasswordPropertyChanged));//属性改变调的函数
public static void SetPassword(DependencyObject element, string value)
{
element.SetValue(PasswordProperty, value);
}
public static string GetPassword(DependencyObject element)
{
return (string) element.GetValue(PasswordProperty);
}
public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached(
"Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(default(bool),Attach));
public static void SetAttach(DependencyObject element, bool value)
{
element.SetValue(AttachProperty, value);
}
public static bool GetAttach(DependencyObject element)
{
return (bool) element.GetValue(AttachProperty);
}
public static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached(
"IsUpdating", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(default(bool)));
public static void SetIsUpdating(DependencyObject element, bool value)
{
element.SetValue(IsUpdatingProperty, value);
}
public static bool GetIsUpdating(DependencyObject element)
{
return (bool) element.GetValue(IsUpdatingProperty);
}
private static void OnPasswordPropertyChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;//sender就是实例
if (passwordBox != null)
{
passwordBox.PasswordChanged -= PasswordChanged; //在WPF绑定密码有说为何这样做
//我们需要修改的是在更改,所以不能让他继续 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;
}
//e.OldValue 改变前的值
if ((bool)e.OldValue)//如果之前有绑定,我们就解绑
{
passwordBox.PasswordChanged -= PasswordChanged;
}
//e.NewValue 改变的值
if ((bool)e.NewValue)
{
passwordBox.PasswordChanged += PasswordChanged;
}
}
private static void PasswordChanged(object sender, RoutedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
if (passwordBox != null)
{
SetIsUpdating(passwordBox, true);//设置我们修改的是UI绑定的修改,那么不更改PasswordBox.password
//设置是false会修改,我们通知修改密码,然后他修改后台password又通知PasswordChanged 这样会炸
SetPassword(passwordBox, passwordBox.Password);
SetIsUpdating(passwordBox, false);
}
}
}
我们的 ViewModel 有一个属性 password ,注意我们使用 Binding 把他绑定到 PasswordBox 的密码。绑定的过程
不需要去做修改,直接加上view:PasswordBoxHelper.Attach="True" view:PasswordBoxHelper.Password="{Binding Password,Mode=TwoWay}"
代码很简单,也就是把 不可绑定的 Password 改为下面的属性
<PasswordBox view:PasswordBoxHelper.Attach="True"
view:PasswordBoxHelper.Password="{Binding Password,Mode=TwoWay}"
>
注意需要引用命名,好像属性比较长,但是我也没有好方法让他比较好看
附加属性使用的比较多,是不是需要我来写一个博客说下什么是附加属性。
对于 WPF 几乎和rt一样的 附加属性,如果没有找到 好的博客,直接去看 wpf就好啦,我在使用发现不需要去学新的东西就可以使用。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
win10 uwp 绑定密码的更多相关文章
- win10 uwp 绑定多数据
经常我们需要绑定的数据有多个,当添加到集合控件的对象类型结构比较复杂,我们希望自己来定义排版布局,这时可以使用ItemTemplate用资源的定义 现在有数据 public class caddres ...
- win10 uwp 绑定静态属性
Jasoon 大神问,如何绑定静态属性. 我们经常有静态属性,那么我们如何绑定 假如我们的ViewModel有一个静态属性 public static string CVTE { set; get; ...
- WPF 绑定密码
我们发现我们无法绑定密码框的密码,PasswordBox 的 Password 不能绑定. 我们想做 MVVM ,我们需要绑定密码,不能使用前台 xaml.cs 监听 密码改变得到密码的值,传到 Vi ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP应用发布流程
简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变. 这篇博文记录了我们发布一款Win10 UWP应用的基本流程,希望为 ...
- win10 uwp MVVM 轻量框架
如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...
- win10 uwp DataContext
本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...
- win10 uwp 商业游戏
本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ...
随机推荐
- 201521123068 《java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 泛型,即参数化类型,不考虑类型参数的继承关系,getClass方法的返 ...
- 201521123013 《Java程序设计》第4周学习总结
1. 本章学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.多态是面向对象的三大特性之一.多态的意思:相同的形态,可以实不同的行为.Java中实现多 ...
- 201521123005《java程序设计》第三周学习总结
1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.使用思维导图将这些碎片化的概念.知识组织起来.使用工具画出本周学习到的知识点. 参考资料: 百度脑图 XMind 2. 书面作业 ·Q ...
- 201521123090《Java程序设计》第1周学习总结
1.学习总结 初步了解面对对象编程思想 使用eclipse关联git管理代码 简单了解java 2.书面作业 Q:为什么java程序可以跨平台运行?执行java程序的步骤是什么?(请用自己的语言书写) ...
- 社工数据搜索引擎搭建 - Build Social Engineer Evildata Search Engine
如何设计搭建一个社工库 从初起设计一个社工库,到现在的Beta,前前后后零零整整花了不下一个月的时间,林林总总记录下来,留给需要之人 泄露数据库格式不一,长相奇葩,因需将用户名.密码.邮箱.哈希等信息 ...
- 201521123119《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1.常用异常 题目5-1 Q1.1 截图你的提交结果(出现学号) Q1.2 ...
- JAVA课程设计个人博客 学生成绩管理 201521123014 黄绍桦
1. 团队课程设计博客链接 http://www.cnblogs.com/kawajiang/p/7062407.html 2.个人负责模块或任务说明 本人主要负责DAO模式.添加和修改学生的信息功能 ...
- ul中li居中显示的table方法
废话不多,贴代码 <ul> <li>1</li> <li>2</li> <li>3</li> <li>4 ...
- 定位页面元素之xpath详解以及定位不到测试元素的常见问题
一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是 ...
- Promise小书(长文)
promise基础 Promise是异步编程的一种解决方案.ES6 Promise的规范来源于Promises/A+社区,它有很多版本的实现. Promise比传统的解决方案(回调函数和事件)更合理和 ...