首页 > 其他分享 >WPF 解决PasswordBox 属性Password无法绑定到后台的问题

WPF 解决PasswordBox 属性Password无法绑定到后台的问题

时间:2023-12-12 21:35:27浏览次数:29  
标签:PasswordChanged PasswordBox 绑定 static passwordBox WPF Password public dp

在 WPF 中,你可以使用密码框的 Password 属性来绑定到后台,但是由于安全性考虑,WPF 的密码框不直接支持双向绑定。然而,你仍然可以通过其他方式实现将密码框的内容绑定到后台。

一种常见的方法是创建一个附加属性(Attached Property)来实现密码框的双向绑定。以下是一个简单的示例代码:

csharpCopy Code
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 中,你可以这样使用这个附加属性:

xmlCopy Code
<PasswordBox local:PasswordBoxHelper.BindPassword="True" 
             local:PasswordBoxHelper.BoundPassword="{Binding YourPasswordProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

在这个示例中,YourPasswordProperty 是你 ViewModel 中表示密码的属性,它使用了双向绑定,允许将密码框中的内容绑定到后台。

通过使用附加属性,你可以实现密码框与后台属性的双向绑定,确保安全性的同时满足 MVVM 设计模式的要求。

标签:PasswordChanged,PasswordBox,绑定,static,passwordBox,WPF,Password,public,dp
From: https://www.cnblogs.com/yuxiangblog/p/17897869.html

相关文章

  • [转][C#][WPF]MVVM 下的 ComboBox 数据绑定效果
    参考:https://www.cnblogs.com/xpvincent/p/3848790.html参考:https://blog.csdn.net/zhudaokuan/article/details/109059333前端:<ComboBoxName="cmbBox"ItemsSource="{Bindinglist}"DisplayMemberPath="Code"SelectedValu......
  • 界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)
    DevExpressWPF的SideNavigation(侧边导航)、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或OutlookNavBar(导航栏),DevExpressWPFNavBar和Accordion控件包含了许多开发人员友好的功能,专门设计用于帮助用户构建极佳的应用功能。在上文中(点击这里回......
  • "firmwarepasswd": MacOS Firmware Password Management: CHECK and DELETE Macbook P
    Abaels-MacBook-Pro:~abaelhe$suPassword:bash-3.2#firmwarepasswd-checkPasswordEnabled:Yesbash-3.2#firmwarepasswd-deleteDeleteFirmwarePasswordEnterpassword:PasswordremovedNOTE:MustrestartbeforechangeswilltakeeffectUsage:firmw......
  • WPF 制作三个点从左到右过渡隐藏显示
     Code:<Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.micros......
  • 一个适用于定制个性化界面的WPF UI组件库
    前言今天给大家推荐一个能让你用最少的代码来实现期望的UI效果,适用于定制个性化界面的WPFUI组件库:Panuon.WPF.UI。组件库官方介绍Panuon.WPF.UI是一个适用于定制个性化UI界面的组件库。它能帮助你快速完成样式和控件的UI设计,而不必深入了解WPF的ControlTemplate、Storyboa......
  • wpf data binding
     publicpartialclassWindow2:Window{publicPersonvmPerosn=newPerson();publicWindow2(){InitializeComponent();vmPerosn.Name="JackZhao";vmPerosn.Phone=&qu......
  • 浅谈WPF之控件拖拽与拖动
    使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖......
  • WPF 绑定binding都有哪些事件
    在WPF中,源属性(SourceProperty)指的是提供数据的属性,通常是数据模型或者其他控件的属性,而目标属性(TargetProperty)则是数据绑定的目标,通常是绑定到控件的属性,例如TextBlock的Text属性。数据绑定将源属性的值自动更新到目标属性中。 主要包含以下几个事件:1. UpdateSourceTrigg......
  • wpf 颜色转换常用方法
    设置颜色:Colorcolor=Color.FromArgb(透明度,red数字,green数字,blue数字);//这四个数字范围都是(0-255)Colorcolor=Color.FromRgb(red数字,green数字,blue数字);//默认透明度为255;button.BackGround=newSolidColorBrush(Colors.AliceBlue);String转换成Color:Color......
  • WPF控件—DataGrid(1)
    DataGrid:表示用于在可自定义的网格中显示数据的控件。命名空间:System.Windows.Controls属性:SelectionMode:值为“Extended”和“Single”,分别表示可选取多行和单行。SelectionUnit:值为:“FullRow”、"Cell"、"CellOrRowHeader",该值分别指示是否可以在 DataGrid 中选择行、单元......