一、概述

众所周知,绑定的源既可以是依赖属性也可以是普通的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绑定(八)的更多相关文章

  1. WPF 数据绑定Binding

    什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...

  2. WPF数据绑定Binding(二)

    WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...

  3. WPF——数据绑定(一)什么是数据绑定

    注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...

  4. 剖析WPF数据绑定机制

    引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...

  5. WPF 10天修炼 第十天- WPF数据绑定

    WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...

  6. WPF——TargetNullValue(如何在绑定空值显示默认字符)

    原文:WPF--TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段. </Grid> { L ...

  7. 微软原文翻译:适用于.Net Core的WPF数据绑定概述

    原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...

  8. CPF 入门教程 - 数据绑定和命令绑定(二)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...

  9. C#WPF数据绑定模板化操作四步走

    前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...

  10. WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension

    问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...

随机推荐

  1. Java基础00-基础语法3

    1. 注释 1.1 注释概述 1.2 注释分类 1.3 示例 2. 关键字 2.1 关键字概述 2.2 关键字的特点 3. 常量 3.1 常量的概述 3.2 常量分类 以上常量除了空常量都是可以直接输 ...

  2. 在SublimeText3中搭建Verilog开发环境记录(一)

    ------------恢复内容开始------------ ------------恢复内容开始------------ ## 前言 *工欲善其事,必先利其器* 一款好用的撸码软件,能够大大的提高工 ...

  3. Oracle19c 如何用rman duplicate 克隆一个数据库。(Backup-Based, no achive log)

    Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...

  4. mysql - 按条件统计

    在表中分别统计mt =0 和 mt>0 的个数 方法一:select count(if(mt=0,1,null)) as a,count(if(mt>0,1,null)) as b fro ...

  5. Python基础之读写xml总结

    参考文章:https://blog.csdn.net/weixin_42749767/article/details/82770563 先介绍xml.dom.minidom包,有一个读写的例子 rea ...

  6. OpenFaaS实战之七:java11模板解析

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 使用vue实现用户管理 添加及删除功能

    简单的管理系统-增删改查 添加及删除功能 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  8. Mongodb集成LDAP授权

    一.环境简介 Mongodb enterprise v4.0.16 OpenLDAP v2.4.44 二.Mongodb集成LDAP的授权过程 客户端指定某种外部验证方式链接Mongodb: Mong ...

  9. Java方法01——什么是方法

    例子 package method;public class Demon02 { //main 方法 public static void main(String[] args) { //实际参数:实 ...

  10. 为什么大部分的Android开发成为不了架构师

    小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL).所以,架构师在广大码农中的占比大概平均不到 10%.而架构师也可以分为初级.中级.高级三档,江湖上真正高水平的软件架构师就更少了. ...