切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
WPF
winfrom
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
桌面程序
XAML PasswordBox控件绑定
[TOC] ## 1. PasswordBox 控件绑定 WPF中 PasswordBox 控件无法直接使用绑定,首先获取 PasswordBox 控件的值使用的是 Password 而非 Text,Password 属性不是一个依赖属性,在 WPF 中不是依赖属性是不能绑定的,因此 Password 直接绑定是不行的,这时就需要借助`其它的属性`来实现绑定,其它属性指的就是`附加属性`,通过定义一个是依赖属性类型的附加属性来进行绑定,通常我们会将这样的附加属性放在一个 Helper 类型,下面的章节将说明如何创建这样一个有附加属性的 Helper 类 ### 1.1. 附加属性 #### 1.1.1. 创建附加属性 创建一个帮助类,在这个帮助类中创建附加属性,这个附加属性需要是一个依赖属性,因此使用 `DependencyProperty.RegisterAttached` 来注册一个属性,这样的属性需要两个方法,一个返回值,一个设置值,下面是一个为 PasswordBox 控件创建附加属性的帮助类(PasswordHelper)示例 ```csharp public class PasswordHelper { public static string GetYukiPassword(DependencyObject obj) { return (string)obj.GetValue(YukiPasswordProperty); } public static void SetYukiPassword(DependencyObject obj, string value) { obj.SetValue(YukiPasswordProperty, value); } // Using a DependencyProperty as the backing store for YukiPassword. This enables animation, styling, binding, etc... public static readonly DependencyProperty YukiPasswordProperty = DependencyProperty.RegisterAttached("YukiPassword", typeof(string), typeof(PasswordHelper)); } ``` >** Tips:**创建附加属性时可以使用代码段 propa #### 1.1.2. 使用附加属性 + 引入附加属性:首先将上面创建的附加属性帮助类(PasswordHelper)引入到 XAML 文件中,下面代码中的 `xmlns:yukiph="clr-namespace:StudyWPF.PropertyHelper"` + 使用附加属性:引入之后在 PasswordBox 控件中就可以使用创建的附加属性 `yukiph:PasswordHelper.YukiPassword`,然后将这个 `YukiPassword` 绑定到后端的视图模型(VM)中的Password字段 + 提醒 Password 属性变更:上一步后,只是实现了 `YukiPassword` 属性的绑定,并没有将 PasswordBox 控件的 Password 属性绑定上,因此还需要对 Password 进行变更提醒,当 `YukiPassword` 属性发生变化时我们去操作 Password 属性 ```XML <Window x:Class="StudyWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:StudyWPF" xmlns:yukiph="clr-namespace:StudyWPF.PropertyHelper" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <!-- 引入附加属性帮助类,在XAML中的命名控件为 yukiph--> <PasswordBox Grid.Row="1" Height="30" Margin="5" yukiph:PasswordHelper.YukiPassword="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> </Grid> </Window> ``` >** Tips:**视图上 PasswordBox 控件在绑定VM的Password属性时,使用了Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,这里是声明了此绑定是双向绑定,当值发生变化时触发绑定 ### 1.2. PasswordBox.Password 绑定 经过上面的操作后,已经将自定义属性 `YukiPassword` 与VM模型属性绑定了,现在要做的是如何将PasswordBox的Password属性关联上,当PasswordBox的Password属性变化时,`YukiPassword` 属性也要随之变化,这里就可以使用PasswordBox的PasswordChanged事件,而 `YukiPassword` 发生变化也要通知界面上的PasswordBox变化,这里就需要使用到 `YukiPassword` 的 propertyChangedCallback 回调 + 实现 PasswordBox.Password 变化到 `YukiPassword` 的变化 要实现这一步还需要再定义一个附加属性,借助附加属性默认值的变化,触发回调函数,随后在回调函数中实现 PasswordBox 控件 PasswordChanged 事件的绑定,将下面的代码放入 PasswordHelper 帮助类下 ```csharp public static bool GetIsEnablePasswordPropertyChanged(DependencyObject obj) { return (bool)obj.GetValue(IsEnablePasswordPropertyChangedProperty); } public static void SetIsEnablePasswordPropertyChanged(DependencyObject obj, bool value) { obj.SetValue(IsEnablePasswordPropertyChangedProperty, value); } // Using a DependencyProperty as the backing store for IsEnableBind. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsEnablePasswordPropertyChangedProperty = DependencyProperty.RegisterAttached("IsEnablePasswordPropertyChanged", typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, OnPasswordPropertyChanged)); /// <summary> /// IsEnablePasswordPropertyChanged 为TRUE 时执行 /// </summary> /// <param name="d"></param> /// <param name="e"></param> private static void OnPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // 当前控件是 PasswordBox 有效 PasswordBox pwd = d as PasswordBox; if (pwd == null) { return; } if ((bool)e.NewValue) { // 当值发生变化时,执行附加事件操作 pwd.PasswordChanged += OnPwdProChange; } else { pwd.PasswordChanged -= OnPwdProChange; } } /// <summary> /// 当PasswordBox的值改变时,自定义的附加属性 YukiPassword 的值也发生变化,而 YukiPassword 又绑定了 VM 属性,因此就实现了 PasswordBox 中 Password 的绑定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void OnPwdProChange(object sender, RoutedEventArgs e) { PasswordBox pwd = (PasswordBox)sender; if (pwd != null) { SetYukiPassword(pwd, pwd.Password); } } ``` 视图上需改的内容,添加新附加属性 IsEnablePasswordPropertyChanged 并将其由默认值false修改为True,这样就是可能触发 IsEnablePasswordPropertyChanged 属性的回掉函数 OnPasswordPropertyChanged,在回调函数中再将 PasswordChanged 事件绑定到 OnPwdProChange 方法,通过 SetYukiPassword 函数来变更 `YukiPassword` 值 ```XML <PasswordBox x:Name="pwd" Grid.Row="1" Grid.Column="1" Height="30" Margin="5" yukiph:PasswordHelper.YukiPassword="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" yukiph:PasswordHelper.IsEnablePasswordPropertyChanged="True"/> ``` + 实现 `YukiPassword` 变化到 PasswordBox.Password 的变化 这里只需为 `YukiPassword` 属性追加默认值及值发生变更时的回调函数,通过回调函数来修改 PasswordBox.Password 的值 ```csharp public static readonly DependencyProperty YukiPasswordProperty = DependencyProperty.RegisterAttached("YukiPassword", typeof(string), typeof(PasswordHelper),new PropertyMetadata(string.Empty, OnPwdPropertyChanged)); private static void OnPwdPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { PasswordBox pwd = d as PasswordBox; if (pwd == null) { return; } pwd.Password = (string)e.NewValue; // PasswordBox 控件有一个问题,如果有值的情况下,PasswordBox 再次聚焦时光标会移动到最前面 pwd.GetType().GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(pwd, new object[] { pwd.Password.Length, 0 }); } ``` 完成这一步之后 PasswordBox控件的 Password 属性双向绑定就完成了,调试ok的 > **Tips:**这里需要注意的是 PasswordBox 有值聚焦时光变移动到最前的问题,代码中已对此做了调整 ### 1.3. 实现流程图 
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号