WPF 解决PasswordBox 属性Password无法绑定到后台的问题
在 WPF 中,你可以使用密码框的 Password
属性来绑定到后台,但是由于安全性考虑,WPF 的密码框不直接支持双向绑定。然而,你仍然可以通过其他方式实现将密码框的内容绑定到后台。
一种常见的方法是创建一个附加属性(Attached Property)来实现密码框的双向绑定。以下是一个简单的示例代码:
public static class PasswordBoxHelper
{
public static readonly DependencyProperty BoundPassword =
DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordBoxHelper), new PropertyMetadata(string.Empty, OnBoundPasswordChanged));
public static readonly DependencyProperty BindPassword = DependencyProperty.RegisterAttached(
"BindPassword", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, OnBindPasswordChanged));
private static bool _isUpdating;
public static void SetBindPassword(DependencyObject dp, bool value)
{
dp.SetValue(BindPassword, value);
}
public static bool GetBindPassword(DependencyObject dp)
{
return (bool)dp.GetValue(BindPassword);
}
public static string GetBoundPassword(DependencyObject dp)
{
return (string)dp.GetValue(BoundPassword);
}
public static void SetBoundPassword(DependencyObject dp, string value)
{
dp.SetValue(BoundPassword, value);
}
private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var passwordBox = d as PasswordBox;
if (passwordBox == null)
{
return;
}
passwordBox.PasswordChanged -= PasswordChanged;
if (!_isUpdating)
{
passwordBox.Password = (string)e.NewValue;
}
passwordBox.PasswordChanged += PasswordChanged;
}
private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
{
var passwordBox = dp as PasswordBox;
if (passwordBox == null)
{
return;
}
if ((bool)e.OldValue)
{
passwordBox.PasswordChanged -= PasswordChanged;
}
if ((bool)e.NewValue)
{
passwordBox.PasswordChanged += PasswordChanged;
}
}
private static void PasswordChanged(object sender, RoutedEventArgs e)
{
var passwordBox = (PasswordBox)sender;
_isUpdating = true;
SetBoundPassword(passwordBox, passwordBox.Password);
_isUpdating = false;
}
}
在 XAML 中,你可以这样使用这个附加属性:
<PasswordBox local:PasswordBoxHelper.BindPassword="True"
local:PasswordBoxHelper.BoundPassword="{Binding YourPasswordProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
在这个示例中,YourPasswordProperty
是你 ViewModel 中表示密码的属性,它使用了双向绑定,允许将密码框中的内容绑定到后台。
通过使用附加属性,你可以实现密码框与后台属性的双向绑定,确保安全性的同时满足 MVVM 设计模式的要求。
WPF 解决PasswordBox 属性Password无法绑定到后台的问题的更多相关文章
- WPF中PasswordBox控件无法绑定Password属性解决办法
在WPF中,默认的Password控件的Password属性是不允许为之绑定的,下面是一个解决绑定Password的方法的代码: 1.前台代码 <Window x:Class="Pas ...
- 解决PasswordBox的Password非依赖属性,而无法绑定的问题,以及常规命令如何使用
http://stackoverflow.com/questions/1483892/how-to-bind-to-a-passwordbox-in-mvvm
- 【转】WPF中PasswordBox控件的Password属性的数据绑定
英文原文:http://www.wpftutorial.net/PasswordBox.html 中文原文:http://blog.csdn.net/oyi319/article/details/65 ...
- WPF中PasswordBox控件的Password属性的数据绑定
原文:WPF中PasswordBox控件的Password属性的数据绑定 英文原文:http://www.wpftutorial.net/PasswordBox.html 中文原文:http://bl ...
- WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...
- 解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
从事WPF开发一年有余,对于图片显示模糊相信很多人都遇到过.网络上查找能得到一堆解决方法,但都是会带来其他负面影响得不到最佳效果.其实,有些图片会因为垂直分辨率/水平分辨率不同而造成在WPF界面上显示 ...
- [WPF源码分析]ContentControl依赖项属性的双向绑定,two-way binding view's DependencyProperty and ViewModel's variable
问题:自定义控件的依赖项属性和VIewModel中的变量不能双向绑定 解决思路:对比.net源码 PresentationFramework / System.Windows.Controls ...
- WPF利用通过父控件属性来获得绑定数据源RelativeSource
WPF利用通过父控件属性来获得绑定数据源RelativeSource 有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系,如下是一段XAML代码,说明多层布局控件中 ...
- 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...
- 浅谈WPF依赖项属性
浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...
随机推荐
- Recent 做题记录(重写)
重构. 2023.9 CF922D 考虑交换法即可.Livshits-Kladov 定理. CF1528C 第一棵树上是一条链:第二棵树上使用数据结构维护贪心(小的区间比大的更优:树上具有包含/无交性 ...
- q-analog 学习笔记(待整修)
联考题考这个不会就来学了 首先给出对其的定义. 对于一个对象 \(u\),构造关于 \(q\) 的某表达式 \(f(q)\),使得: \[\lim_{q\to 1}f(q)=u \] 然而这个可能没有 ...
- donet 常用命令汇总......
dotnet new: 用于创建新的.NET项目. 示例:创建一个名为 "MyConsoleApp" 的控制台应用程序项目. dotnet new console -n MyCon ...
- TortoiseGit 在windows11 中使用,建议升级到 2.13.0版本以后
- SIT、UAT以及PROD环境的区别
题记部分 一.SIT环境 SIT(System Integration Testing)环境主要用于系统集成测试,旨在验证系统中不通模块之间的集成和交互是否正常工作.这个环境通常用于开发团队内部进 ...
- Sqoop1的导入导出
Sqoop1 和 Sqoop2 的区别 # 版本上 Sqoop1: 1.4.x Sqoop2: 1.99.x # 架构上 Sqoop1 使用 Sqoop客户端直接提交的方式(命令.将命令封装在脚本中) ...
- Flink运行时架构
一.运行时的组件和基本原理 1.作业管理器 (1)控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行. (2)JobManager会先接收到要执行的应用 ...
- 印度股票实时行情API数据源接口
StockTV API: 提供实时和历史行情数据,覆盖印度所有股票和指数,支持WebSocket和REST API接口.(推荐使用,对接简单,有技术支持) 新浪财经:提供股票市场数据,可以优先考虑 ...
- @SpringBootApplication自动配置原理
@EnableAutoConfiguration 是核心,他会调用一个@Import注解.我们已知Import自动配置得实现是通过创建ImportSelector 接口的实现类并重写里面selectI ...
- 记录网站从http升级到https遇到的问题
1.静态资源(js.css)引入问题 在使用http是之后,如果你的站点出现引入外部的js.css等,你需要修改你的资源引入,cdn的话可以写成://cdn.bootscdn.com/jquery.m ...