WPF---数据绑定之PasswordBox绑定(八)
一、概述
众所周知,绑定的源既可以是依赖属性也可以是普通的CLR属性,而绑定的目标只能是依赖属性。
控件PasswordBox的Password属性不是依赖属性,不可以作为绑定的目标与后台数据进行绑定,而在MVVM模式中,前台和后台的绑定是经常需要的,为了达到这种目的,我们可以借助附加属性来实现PasswordBox的Password属性的绑定。
二、绑定思路
思路如下:
1)定义一个PasswordBoxHelper类,在类中定义PasswordProperty、AttachProperty和IsUpdatingProperty三个附加属性以及相应的属性改变事件;
2)在AttachProperty的OnAttachPropertyChanged事件中添加PasswordBox的PasswordChanged事件处理程序,这样PasswordBox控件中输入密码的时候,就会触发PasswordBoxHelper类中PasswordChanged事件处理函数;
3)PasswordChanged事件处理函数执行的时候,把控件中的信息赋值给PasswordBoxHelper类中的依赖属性PasswordProperty;
三、Demo
1 <Window x:Class="PasswordBinding.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:PasswordBinding"
7 mc:Ignorable="d"
8 Title="MainWindow" Height="447.125" Width="525">
9 <Grid>
10 <Grid.RowDefinitions>
11 <RowDefinition Height="134*"/>
12 <RowDefinition Height="101*"/>
13 </Grid.RowDefinitions>
14 <Grid.ColumnDefinitions>
15 <ColumnDefinition Width="60*"/>
16 <ColumnDefinition Width="457*"/>
17 </Grid.ColumnDefinitions>
18 <TextBlock Margin="10 50" Text="密码:"></TextBlock>
19 <PasswordBox Grid.Row="0" Grid.Column="1" Margin="10,50,10,157" BorderBrush="Red" local:PasswordBoxHelper.Attach ="True" Name="pwd"
20 local:PasswordBoxHelper.Password ="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
21 <TextBlock Margin="10,30,10,10" Text="显示:" Grid.Row="1" Grid.Column="0"></TextBlock>
22 <TextBlock Grid.Row="1" Grid.Column="1" Margin="10,70,10,72" Background="AliceBlue" Foreground="#FF4EB24E" Name="tbl" />
23 <!--附加属性绑定的时候,记得一定要加括号!!!-->
24 <TextBlock Grid.Column="1" Margin="10,10,10,135" Background="AliceBlue" Foreground="#FF4EB24E" Grid.Row="1" Text="{Binding ElementName=pwd, Path=(local:PasswordBoxHelper.Password)}" />
25 <Button Grid.Row="1" Grid.Column="1" Margin="370,135,0,0" Content="显示密码" Click="Button_Click" ></Button>
26
27 </Grid>
28 </Window>
1 using System.Windows;
2
3 namespace PasswordBinding
4 {
5 /// <summary>
6 /// Interaction logic for MainWindow.xaml
7 /// </summary>
8 public partial class MainWindow : Window
9 {
10 //private string password;
11
12 //public string Password
13 //{
14 // get { return password; }
15 // set { password = value; }
16 //}
17
18 public string Password//依赖属性具有自动通知的能力,不需要实现INotifi接口
19 {
20 get { return (string)GetValue(PasswordProperty); }
21 set { SetValue(PasswordProperty, value); }
22 }
23
24 // Using a DependencyProperty as the backing store for Password. This enables animation, styling, binding, etc...
25 public static readonly DependencyProperty PasswordProperty =
26 DependencyProperty.Register("Password", typeof(string), typeof(MainWindow), new PropertyMetadata(""));
27
28
29 public MainWindow()
30 {
31 InitializeComponent();
32 this.DataContext = this;
33 }
34
35 private void Button_Click(object sender, RoutedEventArgs e)
36 {
37 //tbl.Text = password;
38 tbl.Text = PasswordBoxHelper.GetPassword(pwd);
39 }
40 }
41 }
1 using System.Windows;
2 using System.Windows.Controls;
3
4 namespace PasswordBinding
5 {
6
7 public static class PasswordBoxHelper
8 {
9
10 public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper),
11 new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
12 public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, OnAttachPropertyChanged));
13
14 private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxHelper));
15
16
17 public static void SetAttach(DependencyObject dp, bool value)
18 {
19 dp.SetValue(AttachProperty, value);
20 }
21
22 public static bool GetAttach(DependencyObject dp)
23 {
24 return (bool)dp.GetValue(AttachProperty);
25 }
26
27 public static string GetPassword(DependencyObject dp)
28 {
29 return (string)dp.GetValue(PasswordProperty);
30 }
31
32 public static void SetPassword(DependencyObject dp, string value)
33 {
34 dp.SetValue(PasswordProperty, value);
35 }
36
37 private static bool GetIsUpdating(DependencyObject dp)
38 {
39 return (bool)dp.GetValue(IsUpdatingProperty);
40 }
41
42 private static void SetIsUpdating(DependencyObject dp, bool value)
43 {
44 dp.SetValue(IsUpdatingProperty, value);
45 }
46
47 private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
48 {
49 PasswordBox passwordBox = sender as PasswordBox;
50 passwordBox.PasswordChanged -= PasswordChanged;
51 if (!(bool)GetIsUpdating(passwordBox))
52 {
53 passwordBox.Password = (string)e.NewValue;
54 }
55 passwordBox.PasswordChanged += PasswordChanged;
56 }
57
58 private static void OnAttachPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
59 {
60 PasswordBox passwordBox = sender as PasswordBox;
61 if (passwordBox == null)
62 {
63 return;
64 }
65 if ((bool)e.OldValue)
66 {
67 passwordBox.PasswordChanged -= PasswordChanged;
68 }
69 if ((bool)e.NewValue)
70 {
71 passwordBox.PasswordChanged += PasswordChanged;
72 }
73 }
74
75 private static void PasswordChanged(object sender, RoutedEventArgs e)
76 {
77 PasswordBox passwordBox = sender as PasswordBox;
78 SetIsUpdating(passwordBox, true);
79 SetPassword(passwordBox, passwordBox.Password);
80 SetIsUpdating(passwordBox, false);
81 }
82 }
83 }

WPF---数据绑定之PasswordBox绑定(八)的更多相关文章
- WPF 数据绑定Binding
什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...
- WPF数据绑定Binding(二)
WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...
- WPF——数据绑定(一)什么是数据绑定
注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...
- 剖析WPF数据绑定机制
引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...
- WPF 10天修炼 第十天- WPF数据绑定
WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...
- WPF——TargetNullValue(如何在绑定空值显示默认字符)
原文:WPF--TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段. </Grid> { L ...
- 微软原文翻译:适用于.Net Core的WPF数据绑定概述
原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...
- CPF 入门教程 - 数据绑定和命令绑定(二)
CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...
- C#WPF数据绑定模板化操作四步走
前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...
- WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension
问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...
随机推荐
- C语言:延时1秒
使用sleep()函数将程序阻塞,头文件在windows系统和linux系统下是不一样的windowsSleep()//第一个字母大写#include <windows.h>函数原型voi ...
- 用Python分析下王小波与李银河写情书最爱用哪些词
作家王小波其实也是我国最早期的程序员,突发奇想,王小波写情书最喜欢用哪些词呢?用Python词云分析下! 直接上代码吧,有注释很好理解.输出的图片设置的比较大,所以运行的比较慢,可以适当把图片尺寸改小 ...
- java网络编程基础——基本网络支持
基本网络支持 java.net包主要为网络编程提供支持. 1.InetAddress InetAddress类代表IP地址,还有两个子类:Inet4Address.Inet6Address. pack ...
- python -- 面向对象编程(类、对象)
一.类 类是用来描述具有相同的属性和方法的对象的集合. 它定义了该集合中每个对象共同拥有的属性和方法. 类是一个独立的单位,它有一个类名,其内部包括成员变量和成员方法,分别用于描述对象的属性和行为. ...
- VSCode 如何远程连接其他主机的 WSL2
VSCode 如何远程连接其他主机的 WSL2 VSCode 的 Remote Deployment 插件对 WSL2 直接提供了支持,能够很方便的连接本机的 WSL2 ,但是并没有提供一个连接远程 ...
- POJ1723,1050,HDU4864题解(贪心)
POJ1723 Soldiers 思维题. 考虑y坐标,简单的货舱选址问题,选择中位数即可. 再考虑x坐标,由于直接研究布置方法非常困难,可以倒着想:不管如何移动,最后的坐标总是相邻的,且根据贪心的思 ...
- 搭建SAMBA服务
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建SABMA服务的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查看相关软件版本 ...
- (Opencv4)二值化图像
(Opencv4)二值化图像 ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...
- 初学MyBatis(踩坑)Error querying database. Cause: java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
最近在学习Mybatis,代码全部根据教程写好了,一运行结果报了一个错误,主要错误内容: Caused by: org.apache.ibatis.exceptions.PersistenceExce ...
- 使用vue实现简单的待办事项
待办事项 效果图 目录结构 详细代码 AddNew.vue <template> <div> <input v-model="content"/> ...