一、概述

众所周知,绑定的源既可以是依赖属性也可以是普通的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. centos7 PostgreSQL_12.7安装-TimeScaleDB_2.01插件安装

    一.安装psql的yum源 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64 ...

  2. Leetcode:面试题55 - II. 平衡二叉树

    Leetcode:面试题55 - II. 平衡二叉树 Leetcode:面试题55 - II. 平衡二叉树 Talk is cheap . Show me the code . /** * Defin ...

  3. 在R中使用Keras和TensorFlow构建深度学习模型

    一.以TensorFlow为后端的Keras框架安装 #首先在ubuntu16.04中运行以下代码 sudo apt-get install libcurl4-openssl-dev libssl-d ...

  4. 【洛谷P2623物品选取】动态规划

    分析 各种背包弄在一起. AC代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #def ...

  5. 【字符串+排序】宇宙总统 luogu-1781

    题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 分析 给字符串排个序. AC代码 #include & ...

  6. 数据库开发之ETL概念

    原文链接:https://blog.csdn.net/jianzhang11/article/details/104240047/ ETL基础概念 - 背景随着企业的发展,各业务线.产品线.部门都会承 ...

  7. (Opencv06)绘制轮廓函数

    (Opencv06)绘制轮廓函数 cv2.drawContours(image, contours, contourIdx, color, thickness) img: 指在哪副图像上绘制轮廓 会改 ...

  8. JMeter Gui – TestElement约定[转]

    转自https://www.cnblogs.com/yigui/p/7615635.html 在编写任何JMeter组件时,必须注意某些特定的约定--如果JMeter环境中正确地运行JMeter组件, ...

  9. 抽奖动画 - lao虎机抽奖

    本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...

  10. 关于C语言中的unsigned

    在C语言中,对unsigned做出(unsigned int)i>=0 判断,将会得到一个永真值. int i; for(i=10;i-sizeof(int)>=0;i--){ print ...