WPF PasswordBox进行数据绑定方法
作者:louzi 发布时间:2022-05-23 03:53:11
标签:WPF,PasswordBox,数据绑定
目录
问题描述
解决办法
本文介绍下PasswordBox进行数据绑定的方法,本文参考链接。
本文完整示例程序见GitHub。
问题描述
PasswordBox的Password属性不是依赖属性,因此无法进行数据绑定。
解决办法
该问题的解决办法有多种,本文介绍如何通过添加附加属性解决该问题。
附加属性是说一个属性本不属于某个对象,但由于某种需求附加到该对象上,通过附加属性可以实现将属性与宿主解耦的目的。附加属性本质上就是依赖属性,只是它们在属性包装器和注册时有区别。注册附加属性使用RegisterAttached方法,注册依赖属性使用Register方法,这两个方法的参数差别并不大。
首先添加一个PasswordBoxBindingHelper类,该类包含一个附加属性(snippet:propa+两次tab),通过设置该属性的PropertyChangedCallback将改变通知到PasswordBox.Password,并通过添加对PasswordBox.PasswordChanged事件的响应来响应PasswordBox.Password的改变。有了该附加属性,即可进行数据绑定。
public static string GetPasswordContent(DependencyObject obj) => (string)obj.GetValue(PasswordContentProperty);
public static void SetPasswordContent(DependencyObject obj, string value) => obj.SetValue(PasswordContentProperty, value);
public static readonly DependencyProperty PasswordContentProperty =
DependencyProperty.RegisterAttached("PasswordContent", typeof(string), typeof(PasswordBoxBindingHelper),
new PropertyMetadata(string.Empty, OnPasswordContentPropertyChanged));
private static void OnPasswordContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var box = d as PasswordBox;
box.PasswordChanged -= OnPasswordChanged;
var password = (string)e.NewValue;
if (box != null && box.Password != password)
box.Password = password;
box.PasswordChanged += OnPasswordChanged;
}
private static void OnPasswordChanged(object sender, RoutedEventArgs e)
{
var box = sender as PasswordBox;
SetPasswordContent(box, box.Password);
}
然后在View中使用该附加属性进行数据绑定,本文示例中主窗口包含一个PasswordBox控件及一个Button按钮:
// xaml 绑定附加属性
<Window ...
xmlns:local="clr-namespace:PasswordBoxBinding"
Title="PasswordBoxBinding" Height="300" Width="450" WindowStartupLocation="CenterScreen">
<Grid>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<PasswordBox MinWidth="200" Height="30" BorderBrush="LightGray" BorderThickness="2"
local:PasswordBoxBindingHelper.PasswordContent="{Binding Password,Mode=TwoWay}"/>
<Rectangle Width="20"/>
<Button Width="80" Height="30" Content="查看密码" Command="{Binding ClickedCommand}"/>
</StackPanel>
</Grid>
</Window>
//xaml.cs 设置绑定源
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
最后创建ViewModel进行逻辑处理:
// ViewModel
public class MainWindowViewModel : INotifyPropertyChanged
{
public string Password
{
get => _password;
set
{
_password = value;
OnPropertyChanged();
}
}
public DelegateCommand ClickedCommand => _clickedCommand ?? (_clickedCommand = new DelegateCommand { ExecuteAction = OnClicked });
// 使用CallerMemberName特性简化代码,并可以避免手动输入错误
public void OnPropertyChanged([CallerMemberName] string name = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
private void OnClicked(object o) => MessageBox.Show($"password: {Password}");
public event PropertyChangedEventHandler PropertyChanged;
private DelegateCommand _clickedCommand;
private string _password;
}
// 实现ICommand
public class DelegateCommand : ICommand
{
public bool CanExecute(object parameter) => CanExecuteAction?.Invoke(parameter) ?? true;
public void Execute(object parameter) => ExecuteAction?.Invoke(parameter);
public event EventHandler CanExecuteChanged;
public Action<object> ExecuteAction { get; set; }
public Func<object, bool> CanExecuteAction { get; set; }
}
来源:https://www.cnblogs.com/louzixl/archive/2021/06/22/14919985.html


猜你喜欢
- 前言:学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作,考虑到我们刚刚接触二叉树,为了能够先易后难地进行讲解,我们
- 1、定义一个接口 Animalpackage com.zh.vo;public interface Animal { void
- 看过阿里巴巴开发手册的同学应该都会对Integer临界值127有点印象。原文中写的是:【强制】所有整型包装类对象之间值的比较,全部使用 eq
- JNI简介JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C
- 一、概述使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强
- 所谓动态折线图,就是折线图能随着手指的滑动进行动态绘制,这里很定会产生动画效果。基于这个效果,这里使用SurfaceView进行制图。实现步
- 一般来说一个 HTML 文档有很多标签,比如“<html>”、“<body>”、“<table>”等,想
- 目录首先看效果图:使用方法:1、普通场景使用2、在DataBinding中使用首先看效果图:整词高亮:分词高亮:下面贴上我封的方法 /**
- java反射机制是什么反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法;反射机制能够做什么1、判断运行对象的所
- 1.初始化顺序当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始
- 前言之所以会有这篇文章,是因为公司的开发环境比较老,寻找一些jar包的时候总是会纠结对应的编译版本,感觉很麻烦,所以写了一个工具类用于读取c
- 前言本文主要讲述如何在同一个窗体内,实现不同功能模块的页面切换。一、准备工作1.搭建一个简单的mvvm项目结构首先搭建一个简单的项目框架,然
- 本文实例讲述了Android编程判断当前应用是否在后台运行的方法。分享给大家供大家参考,具体如下:/** 判断程序是否在后台运行 */pub
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- Java Config 下的Spring Test方式用了三种方式:1.纯手动取bean:package com.wang.test;imp
- public interface ICacheStrategy { &
- 出错信息:Unknown error (0xffffffff)at System.Diagnostics.Process.StartWith
- Android Studio常用快捷键、Android Studio快捷键大全接下来这篇android studio使用教程,主要为大家介绍
- springBoot Junit测试用例出现@Autowired不生效前提条件:1,测试类上面添加支持的注解就能取到spring中的容器的实
- 本文实例为大家分享了java实现图片分割指定大小的具体代码,供大家参考,具体内容如下1.使用工具:ThumbnailsThumbnails